diff options
| author | Qiuwen Lu <[email protected]> | 2016-10-11 20:25:34 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-10-11 20:25:34 +0800 |
| commit | cad893ed9d3edcb2a62a6f4d455d43e22252efe7 (patch) | |
| tree | 59d93ec54913304c0166c74997a47f7d89ec5a6e | |
| parent | 281c6046ecca8b1146846e6002350717297eff50 (diff) | |
在运行时管理器中加入序号申请/释放管理器,用于动态应用增删时的序号管理。
| -rw-r--r-- | runtime/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | runtime/src/app.c | 18 | ||||
| -rw-r--r-- | runtime/src/id.c | 115 | ||||
| -rw-r--r-- | runtime/src/runtime.c | 46 |
4 files changed, 177 insertions, 4 deletions
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index a297475..1259cfe 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -6,7 +6,7 @@ include_directories(${DPDK_INCLUDE_DIR}) add_definitions(${DPDK_C_PREDEFINED})
include_directories(include)
-add_library(runtime src/app.c src/ctx.c src/runtime.c src/hwinfo.c)
+add_library(runtime src/app.c src/ctx.c src/runtime.c src/hwinfo.c src/id.c)
target_link_libraries(runtime ${DPDK_LIBRARY})
target_link_libraries(runtime rt pthread dl)
target_include_directories(runtime INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
\ No newline at end of file diff --git a/runtime/src/app.c b/runtime/src/app.c index a36f6ee..33295c8 100644 --- a/runtime/src/app.c +++ b/runtime/src/app.c @@ -143,6 +143,18 @@ static struct appinfo * __appinfo_lookup_unsafe(const struct app_manager * objec return pinfo_ret; } +/* 删除一个进程 */ +static int __appinfo_delete_unsafe(struct app_manager * object, + struct appinfo * pinfo) +{ + + + + + return 0; +} + + /* 创建一个新的进程 */ static int __appinfo_new_unsafe(struct app_manager * object, const char * sym, cpu_mask_t cpu_mask, unsigned int nr_max_thread) @@ -331,7 +343,6 @@ int __thread_register_unsafe(struct appinfo * pinfo, thread_id_t suppose_sid) int app_manager_appinfo_create(struct app_manager * object, const char * sym, cpu_mask_t cpu_mask) { -#if 0 int nr_max_thread = mask_popcnt(cpu_mask); if (unlikely(nr_max_thread < 0)) { @@ -345,8 +356,6 @@ int app_manager_appinfo_create(struct app_manager * object, int ret = __appinfo_new_unsafe(object, sym, cpu_mask, nr_max_thread); mr_spin_unlock(&object->lock); return ret; -#endif - return 0; } int app_manager_appinfo_register(struct app_manager * object, @@ -389,8 +398,11 @@ out: return ret; } +// 应用反注册流程 int app_manager_appinfo_unregister(struct app_manager * object) { + struct appinfo * pinfo = currect_app_info; + assert(pinfo != NULL); return 0; } diff --git a/runtime/src/id.c b/runtime/src/id.c new file mode 100644 index 0000000..e4312c6 --- /dev/null +++ b/runtime/src/id.c @@ -0,0 +1,115 @@ +/* \brief 序号管理器 + * 负责管理应用号、线程号、全局线程号的分配与撤销 + * + * \author Qiuwen Lu<[email protected]> + * \date 2016-10-11 + */ + +#include <stdint.h> +#include <rte_ip_frag.h> +#include "mr_common.h" +#include <assert.h> + +/* 连续数组组成的位图类型 */ +struct bitmap +{ + size_t sz_bitmap; + uint8_t array[0]; +}; + +// 在位图中找到最靠前的连续空间 +int bitmap_find_continous_space(struct bitmap * object, int space_len, int value) +{ + if (space_len > object->sz_bitmap) return -1; + for(int i = 0; i <= object->sz_bitmap - space_len; i++) + { + int is_useful_space = 1; + for(int j = 0; j < space_len; j++) + { + if (object->array[i + j] == value) continue; + is_useful_space = 0; break; + } + + if (is_useful_space) return i; + } + + return -1; +} + +// 设置位图中连续空间的值 +int bitmap_set_continous_space(struct bitmap * object, int pos, int len, int value) +{ + if (pos >= object->sz_bitmap) return -1; + if (pos + len >= object->sz_bitmap) return -1; + for (int i = pos; i < pos + len; i++) object->array[i] = value; + return 0; +} + +struct id_manager +{ + struct bitmap * bitmap_app_id; + struct bitmap * bitmap_gsid; +}; + +struct id_manager * id_manager_create() +{ + struct id_manager * object; + object = rte_zmalloc("IDManagerCtx", sizeof(struct id_manager), 0); + MR_CHECK(object != NULL, "Runtime, Cannot alloc memory for ID Manager. "); + + // 计算位图空间大小 + size_t total_sz_app_id = sizeof(struct bitmap) + sizeof(uint8_t) * MR_APP_MAX; + size_t total_sz_gsid = sizeof(struct bitmap) + sizeof(uint8_t) * MR_GSID_MAX; + + // 分配位图对象空间 + object->bitmap_app_id = rte_zmalloc(NULL, total_sz_app_id, 0); + MR_CHECK(object->bitmap_app_id != NULL, "Runtime, IDManagerCreate, " + "Cannot alloc memory for bitmap_app_id. "); + + object->bitmap_gsid = rte_zmalloc(NULL, total_sz_gsid, 0); + MR_CHECK(object->bitmap_app_id != NULL, "Runtime, IDManagerCreate, " + "Cannot alloc memory for bitmap_gsid. "); + + // 写位图大小 + object->bitmap_app_id->sz_bitmap = MR_APP_MAX; + object->bitmap_gsid->sz_bitmap = MR_GSID_MAX; + return object; +} + +int id_manager_destory(struct id_manager * object) +{ + rte_free(object->bitmap_app_id); + rte_free(object->bitmap_gsid); + rte_free(object); + return 0; +} + +app_id_t id_manager_apply_app_id(struct id_manager * object) +{ + app_id_t id = bitmap_find_continous_space(object->bitmap_app_id, 1, 0); + if (id < 0) return -1; + bitmap_set_continous_space(object->bitmap_app_id, id, 1, 1); + return id; +} + +int id_manager_release_app_id(struct id_manager * object, app_id_t app_id) +{ + bitmap_set_continous_space(object->bitmap_app_id, app_id, 1, 0); + return 0; +} + +thread_id_t id_manager_apply_gsid(struct id_manager * object, int nr_thread) +{ + thread_id_t gsid_start; + gsid_start = bitmap_find_continous_space(object->bitmap_gsid, nr_thread, 0); + if (gsid_start < 0) return -1; + bitmap_set_continous_space(object->bitmap_gsid, gsid_start, nr_thread, 1); + return 0; +} + +int id_manager_release_gsid(struct id_manager * object, thread_id_t start_gsid, + int nr_thread) +{ + bitmap_set_continous_space(object->bitmap_gsid, start_gsid, nr_thread, 0); + return 0; +}
\ No newline at end of file diff --git a/runtime/src/runtime.c b/runtime/src/runtime.c index aba61aa..05899d5 100644 --- a/runtime/src/runtime.c +++ b/runtime/src/runtime.c @@ -16,11 +16,13 @@ struct app_manager; struct hwinfo_manager; +struct id_manager; struct mr_runtime_ctx { struct app_manager * app_ctx; struct hwinfo_manager * hwinfo_ctx; + struct id_manager * id_ctx; }; extern int mr_global_ctx_init(); @@ -53,6 +55,15 @@ extern int app_manager_list_all_appinfo(struct app_manager * object, struct appinfo * infos[], int nr_max_infos); #endif +// 序号管理器导出函数 +extern struct id_manager * id_manager_create(); +extern int id_manager_destory(struct id_manager * object); +extern app_id_t id_manager_apply_app_id(struct id_manager * object); +extern int id_manager_release_app_id(struct id_manager * object, app_id_t app_id); +extern thread_id_t id_manager_apply_gsid(struct id_manager * object, int nr_thread); +extern int id_manager_release_gsid(struct id_manager * object, thread_id_t start_gsid, + int nr_thread); + void mr_runtime_init() { int ret = mr_global_ctx_init(); @@ -73,6 +84,9 @@ void mr_runtime_init() rt_ctx->hwinfo_ctx = hwinfo_manager_create(); MR_CHECK(rt_ctx->hwinfo_ctx != NULL, "RuntimeInit, HwInfo manager initialize failed. "); + rt_ctx->id_ctx = id_manager_create(); + MR_CHECK(rt_ctx->id_ctx != NULL, "RuntimeInit, ID Manager initialize failed. "); + g_ctx->ctx_runtime = rt_ctx; return; } @@ -91,6 +105,8 @@ void mr_runtime_slave_init() struct mr_runtime_ctx * rt_ctx = (struct mr_runtime_ctx *)g_ctx->ctx_runtime; assert(g_ctx->ctx_runtime != NULL); assert(rt_ctx->app_ctx != NULL); + assert(rt_ctx->hwinfo_ctx != NULL); + assert(rt_ctx->app_ctx != NULL); return; } @@ -159,6 +175,36 @@ int mr_app_manager_thread_unregister() return app_manager_thread_unregister(rt_ctx->app_ctx); } +// 序号管理器导出函数 +app_id_t mr_id_manager_apply_app_id(struct id_manager * object) +{ + struct mr_global_ctx * g_ctx = mr_global_ctx_get(); + struct mr_runtime_ctx * rt_ctx = (struct mr_runtime_ctx *)g_ctx->ctx_runtime; + return id_manager_apply_app_id(rt_ctx->id_ctx); +} + +int mr_id_manager_release_app_id(struct id_manager * object, app_id_t app_id) +{ + struct mr_global_ctx * g_ctx = mr_global_ctx_get(); + struct mr_runtime_ctx * rt_ctx = (struct mr_runtime_ctx *)g_ctx->ctx_runtime; + return id_manager_release_app_id(object, app_id); +} + +thread_id_t mr_id_manager_apply_gsid(struct id_manager * object, int nr_thread) +{ + struct mr_global_ctx * g_ctx = mr_global_ctx_get(); + struct mr_runtime_ctx * rt_ctx = (struct mr_runtime_ctx *)g_ctx->ctx_runtime; + return id_manager_apply_gsid(object, nr_thread); +} + +int mr_id_manager_release_gsid(struct id_manager * object, thread_id_t start_gsid, + int nr_thread) +{ + struct mr_global_ctx * g_ctx = mr_global_ctx_get(); + struct mr_runtime_ctx * rt_ctx = (struct mr_runtime_ctx *)g_ctx->ctx_runtime; + return id_manager_release_gsid(object, start_gsid, nr_thread); +} + #if 0 int mr_app_manager_list_all_appinfo(struct appinfo * infos[], int nr_max_infos) { |
