summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-10-11 20:25:34 +0800
committerQiuwen Lu <[email protected]>2016-10-11 20:25:34 +0800
commitcad893ed9d3edcb2a62a6f4d455d43e22252efe7 (patch)
tree59d93ec54913304c0166c74997a47f7d89ec5a6e
parent281c6046ecca8b1146846e6002350717297eff50 (diff)
在运行时管理器中加入序号申请/释放管理器,用于动态应用增删时的序号管理。
-rw-r--r--runtime/CMakeLists.txt2
-rw-r--r--runtime/src/app.c18
-rw-r--r--runtime/src/id.c115
-rw-r--r--runtime/src/runtime.c46
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)
{