diff options
| author | Qiuwen Lu <[email protected]> | 2016-10-14 21:11:54 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-10-14 21:11:54 +0800 |
| commit | 5ec7adfcdacf6ec73fcb5479cad30ae345dea8c2 (patch) | |
| tree | 49fd4489ed0d01f5ae8be4ae20aa55afa0f5cff5 /pag | |
| parent | f0dbdd531435408fbf4fd8b2ee0fcdad1b19a605 (diff) | |
重构slave库,适应应用动态加载。使用运行时设备库管理运行设备。
Diffstat (limited to 'pag')
| -rw-r--r-- | pag/libpag.c | 104 |
1 files changed, 84 insertions, 20 deletions
diff --git a/pag/libpag.c b/pag/libpag.c index 200a8d8..1af1902 100644 --- a/pag/libpag.c +++ b/pag/libpag.c @@ -14,6 +14,7 @@ #include <mr_rawio.h>
#include <mr_stat.h>
#include <mrlib.h>
+#include <mr_mask.h>
#include "libpag.h"
struct pag_instance
@@ -22,8 +23,11 @@ struct pag_instance char dev_name[MR_STRING_MAX];
raw_socket_t * raw_sockets[MR_DEVICE_MAX];
unsigned int nr_raw_sockets;
+ unsigned int nr_rx_stream;
+ unsigned int nr_tx_stream;
unsigned int burst_rx;
unsigned int burst_tx;
+ uint64_t coremask;
};
struct pag_thread_instance
@@ -57,7 +61,63 @@ do { \ #define PAG_DEFAULT_RX_BURST 32
#define PAG_DEFAULT_TX_BURST 32
-static int __read_burst_info(struct pag_instance * instance)
+static int pag_config_load_app_info(struct pag_instance * instance)
+{
+ int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "app_name",
+ instance->app_name, sizeof(instance->app_name));
+
+ if (ret < 0)
+ {
+ PAG_LOG("load pag.conf failed(section=pag, key=app_name).");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int pag_config_load_stream_info(struct pag_instance * instance)
+{
+ uint64_t coremask = 0;
+ char str_coremask[MR_STRING_MAX];
+ char * str_coremask_ptr;
+
+ // ��CPU��������
+ int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "coremask",
+ str_coremask, sizeof(str_coremask));
+
+ if(ret < 0)
+ {
+ PAG_LOG("coremask is missing, please recheck %s", PAG_CFGFILE);
+ return -1;
+ }
+
+ ret = strtoull(str_coremask, &str_coremask_ptr, 0);
+ if(ret == 0 && str_coremask_ptr == NULL)
+ {
+ PAG_LOG("coremask is invalid, please recheck %s", PAG_CFGFILE);
+ return -2;
+ }
+
+ // ��Ĭ���豸������û��ָ��ʹ���߳���
+ unsigned int nr_rx_stream;
+ unsigned int nr_tx_stream;
+ unsigned int nr_stream_default = mask_popcnt(coremask);
+
+ MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "rxstream",
+ &nr_rx_stream, nr_stream_default);
+ MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "txstream",
+ &nr_tx_stream, nr_stream_default);
+
+ instance->coremask = coremask;
+ instance->nr_rx_stream = nr_rx_stream;
+ instance->nr_tx_stream = nr_tx_stream;
+
+ PAG_LOG("coremask=%"PRIx64", rxstream=%u, txstream=%u", instance->coremask,
+ instance->nr_rx_stream, instance->nr_tx_stream);
+ return 0;
+}
+
+static int pag_config_load_burst_info(struct pag_instance * instance)
{
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "burst_rx", &instance->burst_rx,
PAG_DEFAULT_RX_BURST);
@@ -108,7 +168,9 @@ 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]);
+ 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]);
@@ -130,35 +192,44 @@ static int pag_thread_init(struct pag_instance * instance, if (likely(tinstance->thread_inited != 0))
return 0;
- mrlib_thread_init();
+ marsio_thread_init();
tinstance->rxmbuf_max = instance->burst_rx;
tinstance->txmbuf_max = instance->burst_tx;
tinstance->thread_inited = 1;
return 0;
}
-int pag_open()
+static int pag_config(struct pag_instance * instance)
{
- if (__pag_inited != 0) return 0;
-
- struct pag_instance * instance = &pag_config_;
-
if (access(PAG_CFGFILE, R_OK) != 0)
{
PAG_LOG("load pag.conf failed, pag.conf doesnot existed.");
return -1;
}
+
+ int ret = pag_config_load_app_info(instance);
+ if (ret < 0) return ret;
+ ret = pag_config_load_burst_info(instance);
+ if (ret < 0) return ret;
+ ret = pag_config_load_stream_info(instance);
+ if (ret < 0) return ret;
+ return 0;
+}
- int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "app_name",
- instance->app_name, sizeof(instance->app_name));
+int pag_open()
+{
+ if (__pag_inited != 0) return 0;
+ struct pag_instance * instance = &pag_config_;
+
+ int ret = pag_config(instance);
if(ret < 0)
{
- PAG_LOG("load pag.conf failed(section=pag, key=app_name).");
- return -2;
+ PAG_LOG("load configure failed.");
+ return -1;
}
- ret = mrlib_init(instance->app_name, stderr);
+ ret = marsio_init(instance->app_name, instance->coremask, stderr);
if(ret < 0)
{
PAG_LOG("marsio library init failed(ret=%d).", ret);
@@ -172,13 +243,6 @@ int pag_open() return -4;
}
- ret = __read_burst_info(instance);
- if(ret < 0)
- {
- PAG_LOG("burst info load failed(ret=%d)", ret);
- return -5;
- }
-
__pag_inited = 1;
return 0;
}
|
