diff options
| author | Qiuwen Lu <[email protected]> | 2016-12-07 19:05:23 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-12-07 19:05:23 +0800 |
| commit | 2135c7dd4a03a885efe408a02482601708dfe560 (patch) | |
| tree | 84933fc5e90e69b99fcd6649db24c63ade4e0177 /pag | |
| parent | 868cbec81e0b6322b9ceee7d93edc5ac9900eadb (diff) | |
完成新版原始报文接口的底层逻辑,增加PAG自旋循环优化功能。
Diffstat (limited to 'pag')
| -rw-r--r-- | pag/libpag.c | 83 |
1 files changed, 41 insertions, 42 deletions
diff --git a/pag/libpag.c b/pag/libpag.c index d660c0c..8031b43 100644 --- a/pag/libpag.c +++ b/pag/libpag.c @@ -27,13 +27,13 @@ struct pag_instance {
char app_name[PAG_SYMBOL_MAX];
char dev_name[PAG_STRING_MAX];
- raw_socket_t * raw_sockets[PAG_DEVICE_MAX];
- unsigned int nr_raw_sockets;
+ unsigned int nr_devices;
unsigned int nr_rx_stream;
unsigned int nr_tx_stream;
unsigned int burst_rx;
unsigned int burst_tx;
unsigned int autoexit;
+ unsigned int looptimes;
uint64_t coremask;
};
@@ -48,7 +48,7 @@ struct pag_thread_instance unsigned int txmbuf_used;
unsigned int rxmbuf_cur;
unsigned int txmbuf_cur;
- unsigned int cur_socket;
+ unsigned int cur_device;
// ���������
marsio_buff_t * rxmbuf_ctx;
@@ -68,6 +68,7 @@ do { \ #define PAG_DEFAULT_RX_BURST 32
#define PAG_DEFAULT_TX_BURST 32
#define PAG_DEFAULT_AUTOEXIT 0
+#define PAG_DEFAULT_LOOP 0
int __strsplit(char *string, int stringlen, char **tokens, int maxtokens, char delim)
{
@@ -139,13 +140,21 @@ static int pag_config_load_stream_info(struct pag_instance * instance) &nr_rx_stream, nr_stream_default);
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "txstream",
&nr_tx_stream, nr_stream_default);
+ MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "autoexit",
+ &instance->autoexit, PAG_DEFAULT_AUTOEXIT);
instance->coremask = coremask;
instance->nr_rx_stream = nr_rx_stream;
instance->nr_tx_stream = nr_tx_stream;
- MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "autoexit",
- &instance->autoexit, PAG_DEFAULT_AUTOEXIT);
+ marsio_option_set(instance->app_name, MARSIO_OPT_THREAD_MASK,
+ &instance->coremask, sizeof(instance->coremask));
+ marsio_option_set(instance->app_name, MARSIO_OPT_AUTOEXIT,
+ &instance->autoexit, sizeof(instance->autoexit));
+ marsio_option_set(instance->app_name, MARSIO_OPT_RAW_RX_STREAM_NUM,
+ &instance->nr_rx_stream, sizeof(instance->nr_rx_stream));
+ marsio_option_set(instance->app_name, MARSIO_OPT_RAW_TX_STREAM_NUM,
+ &instance->nr_tx_stream, sizeof(instance->nr_tx_stream));
PAG_LOG("coremask=%"PRIx64", rxstream=%u, txstream=%u, autoexit=%d",
instance->coremask, instance->nr_rx_stream, instance->nr_tx_stream,
@@ -160,6 +169,8 @@ static int pag_config_load_burst_info(struct pag_instance * instance) PAG_DEFAULT_RX_BURST);
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "burst_tx", &instance->burst_tx,
PAG_DEFAULT_TX_BURST);
+ MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "loop", &instance->looptimes,
+ PAG_DEFAULT_LOOP);
if(instance->burst_rx > PAG_BURST_MAX)
{
@@ -179,7 +190,7 @@ static int pag_config_load_burst_info(struct pag_instance * instance) return 0;
}
-static int __open_all_device(struct pag_instance * instance)
+static int pag_config_load_device_info(struct pag_instance * instance)
{
int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "dev_name",
instance->dev_name, sizeof(instance->dev_name));
@@ -204,22 +215,10 @@ static int __open_all_device(struct pag_instance * instance) }
for (int i = 0; i < nr_devices; i++)
- {
- raw_socket_t * socket = marsio_raw_socket(str_devices[i],
- instance->nr_rx_stream, instance->nr_tx_stream, 0);
-
- if (socket == NULL)
- {
- PAG_LOG("cannot open device %s.\n", str_devices[i]);
- return -3;
- }
-
- instance->raw_sockets[instance->nr_raw_sockets] = socket;
- instance->nr_raw_sockets++;
-
- PAG_LOG("device opened: %s", str_devices[i]);
- }
+ marsio_option_set(instance->app_name, MARSIO_OPT_RAW_DEVICE,
+ str_devices[i], sizeof(str_devices[i]));
+ instance->nr_devices = nr_devices;
return 0;
}
@@ -250,6 +249,8 @@ static int pag_config(struct pag_instance * instance) if (ret < 0) return ret;
ret = pag_config_load_stream_info(instance);
if (ret < 0) return ret;
+ ret = pag_config_load_device_info(instance);
+ if (ret < 0) return ret;
return 0;
}
@@ -271,22 +272,14 @@ int pag_open() return -1;
}
- ret = marsio_init(instance->app_name, instance->coremask,
- instance->autoexit, stderr);
-
+ ret = marsio_init(instance->app_name);
+
if(ret < 0)
{
PAG_LOG("marsio library init failed(ret=%d).", ret);
return -3;
}
- ret = __open_all_device(instance);
- if(ret < 0)
- {
- PAG_LOG("device open error(ret=%d)", ret);
- return -4;
- }
-
if (instance->autoexit)
marsio_on_exit_register(__on_exit_pag_close, NULL);
@@ -308,12 +301,14 @@ static int inline __get_frames_from_rtdevice(struct pag_instance * instance, assert((tinstance->rxmbuf_cur >= tinstance->rxmbuf_used));
// һ����rxmbuf_max����������һ��������
- unsigned int cur_socket = tinstance->cur_socket;
- int ret = marsio_raw_recv_burst(instance->raw_sockets[cur_socket], sid,
- tinstance->rxmbuf, tinstance->rxmbuf_max);
+ unsigned int cur_device = tinstance->cur_device;
+ int ret = marsio_raw_recv_burst(cur_device, sid, tinstance->rxmbuf,
+ tinstance->rxmbuf_max);
+
+ if (ret < 0) return ret;
// ���û��������л��ձ��豸
- tinstance->cur_socket = (cur_socket + 1) % instance->nr_raw_sockets;
+ tinstance->cur_device = (cur_device + 1) % instance->nr_devices;
tinstance->rxmbuf_cur = 0;
tinstance->rxmbuf_used = ret;
@@ -321,6 +316,8 @@ static int inline __get_frames_from_rtdevice(struct pag_instance * instance, return ret;
}
+#define __PAG_LOOP_TIMES 5
+
void * pag_get_frame(int sid)
{
struct pag_thread_instance * tinstance = &thread_instance_;
@@ -334,10 +331,14 @@ void * pag_get_frame(int sid) __get_frames_from_rtdevice(instance, tinstance, sid);
}
- // ������������ǿյģ�����
- if (unlikely((tinstance->rxmbuf_used == 0)))
- return NULL;
-
+ int loop_times = 0;
+ while (tinstance->rxmbuf_used == 0 && loop_times < instance->looptimes)
+ {
+ __get_frames_from_rtdevice(instance, tinstance, sid);
+ loop_times++;
+ }
+
+ if (unlikely(tinstance->rxmbuf_used == 0)) return NULL;
tinstance->rxmbuf_ctx = tinstance->rxmbuf[tinstance->rxmbuf_cur++];
return (void *)marsio_buff_mtod(tinstance->rxmbuf_ctx);
}
@@ -374,9 +375,7 @@ void * pag_get(int sid) int pag_close()
{
- struct pag_instance * instance = &pag_config_;
- for (int i = 0; i < instance->nr_raw_sockets; i++)
- marsio_raw_close(instance->raw_sockets[i]);
+ marsio_destory();
return 0;
}
|
