summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-04-12 14:42:58 +0800
committerQiuwen Lu <[email protected]>2017-04-12 14:42:58 +0800
commit00f24a934fe1dd6207c1f836a9ea9e6f2ed44246 (patch)
tree8b1fc0d23aa3088ca22698bdba402fa0fa5e918a
parent7f53b1e7e7e811fd8fbe1c866202839fe2b41b07 (diff)
修正环境启动脚本的Bug,增加了RPM包安装、卸载的环境配置脚本。v4.1.1-20170412
-rw-r--r--.editorconfig7
-rw-r--r--CMakeLists.txt2
-rw-r--r--cmake/Package.cmake3
-rw-r--r--cmake/PostInstall.in2
-rw-r--r--cmake/PostUninstall.in2
-rw-r--r--cmake/PreUninstall.in1
-rw-r--r--conf/mrglobal.conf47
-rw-r--r--runtime/CMakeLists.txt12
-rw-r--r--runtime/include/mr_runtime.h71
-rw-r--r--runtime/include/runtime.h69
-rw-r--r--runtime/src/app.c655
-rw-r--r--runtime/src/ctx.c131
-rw-r--r--runtime/src/event.c479
-rw-r--r--runtime/src/export.c120
-rw-r--r--runtime/src/id.c117
-rw-r--r--runtime/src/runtime.c267
-rw-r--r--tools/systemd/mrenv-script2
17 files changed, 39 insertions, 1948 deletions
diff --git a/.editorconfig b/.editorconfig
index e7c7ee1..37cab03 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -13,4 +13,11 @@ end_of_line=lf
charset=utf-8
indent_style=tab
trim_tailing_whitespace=true
+insert_final_newline=true
+
+[*.in]
+end_of_line=lf
+charset=latin1
+indent_style=tab
+trim_tailing_whitespace=true
insert_final_newline=true \ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 24d57fa..dcd17ae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,7 +32,7 @@ set(MR_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin)
set(MR_INSTALL_LDCONFDIR /etc/ld.so.conf.d/)
set(MR_INSTALL_SYSUNITCONFDIR /etc/sysconfig/)
-exec_program(pkg-config ARGS systemd --variable=systemdsystemconfdir
+exec_program(pkg-config ARGS systemd --variable=systemdsystemunitdir
OUTPUT_VARIABLE MR_INSTALL_SYSUNITDIR)
add_subdirectory(${CMAKE_SOURCE_DIR}/support ${CMAKE_BINARY_DIR}/support)
diff --git a/cmake/Package.cmake b/cmake/Package.cmake
index f8888db..5456410 100644
--- a/cmake/Package.cmake
+++ b/cmake/Package.cmake
@@ -14,4 +14,7 @@ set(CPACK_RPM_PACKAGE_AUTOREQPROV "no")
set(CPACK_RPM_PACKAGE_REQUIRES "/boot/vmlinuz-${MARSIO_VERSION_KERNEL}")
set(CPACK_RPM_PACKAGE_RELEASE_DIST on)
set(CPACK_RPM_DEBUGINFO_PACKAGE on)
+set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PostInstall.in)
+set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PostUninstall.in)
+set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/cmake/PreUninstall.in)
include(CPack) \ No newline at end of file
diff --git a/cmake/PostInstall.in b/cmake/PostInstall.in
new file mode 100644
index 0000000..9161714
--- /dev/null
+++ b/cmake/PostInstall.in
@@ -0,0 +1,2 @@
+%systemd_post mrenv.service mrzcpd.service
+/sbin/ldconfig \ No newline at end of file
diff --git a/cmake/PostUninstall.in b/cmake/PostUninstall.in
new file mode 100644
index 0000000..11ba1cf
--- /dev/null
+++ b/cmake/PostUninstall.in
@@ -0,0 +1,2 @@
+%systemd_postun mrenv.service mrzcpd.service
+/sbin/ldconfig \ No newline at end of file
diff --git a/cmake/PreUninstall.in b/cmake/PreUninstall.in
new file mode 100644
index 0000000..0af56ee
--- /dev/null
+++ b/cmake/PreUninstall.in
@@ -0,0 +1 @@
+%systemd_preun mrenv.service mrzcpd.service \ No newline at end of file
diff --git a/conf/mrglobal.conf b/conf/mrglobal.conf
index 849926c..dd1d6e0 100644
--- a/conf/mrglobal.conf
+++ b/conf/mrglobal.conf
@@ -1,40 +1,35 @@
[device]
-device=mr0,mr1
-[device:mr0]
-in_addr=192.168.44.101
-in_mask=255.255.255.0
-gateway=192.168.44.1
+device=meth0,meth1
+sz_tunnel=2048
+sz_buffer=0
+
+[device:meth1]
+promisc=0
mtu=1500
-promisc=1
-[device:mr1]
+
+[device:meth0]
+promisc=0
mtu=1500
-promisc=1
-vlan-strip=0
-vlan-filter=0
-rssmode=1
[service]
# lcore id for i/o service, use comma to split
-iocore=1,2
+iocore=6,7
# packet distributer mode
# value can be:
# 0:tuple2,source ip and dest ip(software)
# 1:tuple4,source ip port and dest ip port(software)
# 2:use hardware rss result
distmode=0
+keepalive=1
-[buffer]
-# packet buffer count
-block_num=524288
-[vnode]
-sz_rxvnode_ring=1024
-sz_txvnode_ring=1024
-sz_rxvnode_buffer=128
-sz_txvnode_buffer=128
-[burst]
-sz_rx_burst=32
-sz_tx_burst=32
-[stat]
-enable=1
[eal]
-virtaddr=0x7f40c4a00000 \ No newline at end of file
+virtaddr=0x7f40c4a00000
+loglevel=7
+
+[keepalive]
+check_spinlock=1
+
+[pool]
+sz_direct_pktmbuf=65536
+sz_indirect_pktmbuf=65536
+sz_cache=256
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
deleted file mode 100644
index b681298..0000000
--- a/runtime/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-find_package(DPDK REQUIRED)
-include_directories(${CMAKE_SOURCE_DIR}/include)
-include_directories(${CMAKE_SOURCE_DIR}/include/extern)
-include_directories(${CMAKE_SOURCE_DIR}/include/internal)
-include_directories(${DPDK_INCLUDE_DIR})
-
-add_definitions(${DPDK_C_PREDEFINED})
-include_directories(include)
-add_library(mruntime src/app.c src/ctx.c src/runtime.c src/hwinfo.c src/id.c
- src/event.c src/export.c)
-target_link_libraries(mruntime PRIVATE rt pthread dl)
-target_include_directories(mruntime INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") \ No newline at end of file
diff --git a/runtime/include/mr_runtime.h b/runtime/include/mr_runtime.h
deleted file mode 100644
index f1176f2..0000000
--- a/runtime/include/mr_runtime.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#pragma once
-
-#include <common.h>
-#include <sys/queue.h>
-
-struct appinfo;
-
-struct mr_global_ctx
-{
- void * ctx_runtime;
- void * ctx_core;
- void * ctx_stack;
-};
-
-struct mr_global_config
-{
- char glob_cfg_file[MR_STRING_MAX];
-};
-
-int mr_hwinfo_nr_sockets();
-int mr_hwinfo_nr_cpus();
-int mr_hwinfo_physical_cpu_id(int cpu_id);
-int mr_hwinfo_socket_id(int cpu_id);
-
-int mr_app_manager_appinfo_create(const char * sym, cpu_mask_t cpu_mask);
-int mr_app_manager_appinfo_register(const char * sym, cpu_mask_t cpu_mask);
-int mr_app_manager_appinfo_unregister();
-int mr_app_manager_thread_register();
-int mr_app_manager_thread_unregister();
-int mr_app_manager_appinfo_iterate(struct appinfo ** appinfo);
-
-int mr_id_manager_apply_app_id(app_id_t * result);
-int mr_id_manager_release_app_id(app_id_t app_id);
-int mr_id_manager_apply_gsid(int nr_thread, thread_id_t * result);
-int mr_id_manager_release_gsid(thread_id_t start_gsid, int nr_thread);
-
-void mr_runtime_init();
-void mr_runtime_slave_init();
-void mr_runtime_start();
-
-struct mr_global_ctx * mr_global_ctx_get();
-struct mr_global_config * mr_global_config_get();
-
-int mr_app_register(const char * appsym, cpu_mask_t cpumask,
- unsigned int autoexit);
-int mr_thread_register();
-void mr_thread_on_exit_register(void(*exit_fn)(void * arg), void * arg);
-void mr_on_exit_register(void(*exit_fn)(void * arg), void * arg);
-void mr_thread_hook();
-
-thread_id_t mr_thread_id();
-thread_id_t mr_gsid_id();
-socket_id_t mr_socket_id();
-cpu_id_t mr_cpu_id();
-app_id_t mr_app_id();
-
-struct appinfo * mr_app_info_get();
-struct thread_info * mr_thread_info_get();
-app_id_t mr_appinfo_get_app_id(struct appinfo * appinfo);
-const char * mr_appinfo_get_symbol(struct appinfo * appinfo);
-unsigned int mr_appinfo_get_nr_max_thread(struct appinfo * appinfo);
-
-void * mr_app_priv_get();
-void mr_app_priv_set(void * ptr);
-void * mr_thread_priv_get();
-void mr_thread_priv_set(void * ptr);
-
-typedef void(*app_event_cb_t)(int app_event, const char * appsym,
- struct appinfo * appinfo, void * arg);
-int mr_app_crash_cb_register(app_event_cb_t cb, void * arg);
-int mr_app_crash_raiser_register(const char * appsym); \ No newline at end of file
diff --git a/runtime/include/runtime.h b/runtime/include/runtime.h
deleted file mode 100644
index 9394b0e..0000000
--- a/runtime/include/runtime.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-
-#include <mr_common.h>
-
-struct app_manager;
-struct hwinfo_main;
-struct id_manager;
-struct app_ev_manager;
-struct appinfo;
-
-#ifndef MR_RUNTIME_MAX_NR_EXIT_HANDLER
-#define MR_RUNTIME_MAX_NR_EXIT_HANDLER 64
-#endif
-
-struct mr_runtime_ctx
-{
- // ģ�鴦�����
- struct app_manager * app_ctx;
- struct hwinfo_main * hwinfo_ctx;
- struct id_manager * id_ctx;
- struct app_ev_manager * ev_ctx;
-};
-
-extern struct app_manager * app_manager_create();
-extern int app_manager_destory(struct app_manager * object);
-
-// Ӳ��������Ϣ��������
-extern int hwinfo_deinit(struct hwinfo_main * object);
-extern struct hwinfo_main * hwinfo_init();
-extern int hwinfo_nr_sockets(struct hwinfo_main * object);
-extern int hwinfo_nr_cpus(struct hwinfo_main * object);
-extern int hwinfo_physical_cpu_id(struct hwinfo_main * object, int cpu_id);
-extern int hwinfo_socket_id(struct hwinfo_main * object, int cpu_id);
-
-// Ӧ�ù�����Ϣ��������
-extern int app_manager_appinfo_create(struct app_manager * object,
- const char * sym, cpu_mask_t cpu_mask);
-extern int app_manager_appinfo_register(struct app_manager * object,
- const char * sym, cpu_mask_t cpu_mask);
-extern int app_manager_appinfo_unregister(struct app_manager * object);
-extern int app_manager_thread_register(struct app_manager * object);
-extern int app_manager_thread_unregister(struct app_manager * object);
-extern int app_manager_appinfo_iterate(struct app_manager * object, struct appinfo ** appinfo);
-extern struct appinfo * app_mamager_appinfo_lookup(struct app_manager * object, const char * appsym);
-extern void app_mamager_crash_event_handler(int app_event, const char * appsym,
- struct appinfo * appinfo, void * arg);
-
-// ���������������
-extern struct id_manager * id_manager_create();
-extern int id_manager_destory(struct id_manager * object);
-extern int id_manager_apply_app_id(struct id_manager* object, app_id_t* result);
-extern int id_manager_release_app_id(struct id_manager * object, app_id_t app_id);
-extern int id_manager_apply_gsid(struct id_manager* object, int nr_thread, thread_id_t* result);
-extern int id_manager_release_gsid(struct id_manager * object, thread_id_t start_gsid,
- int nr_thread);
-
-extern int mr_global_ctx_init();
-extern int mr_global_ctx_slave_init();
-extern int mr_global_cfg_init();
-extern int mr_global_cfg_slave_init();
-
-// �������
-struct app_ev_manager * app_ev_manager_create(struct mr_runtime_ctx * rt_ctx);
-void app_ev_manager_destory(struct app_ev_manager * object);
-
-typedef void(*app_event_cb_t)(int app_event, const char * appsym, struct appinfo * appinfo, void * arg);
-int app_crash_cb_register(struct app_ev_manager * object, app_event_cb_t cb, void * arg);
-int app_crash_raiser_register(struct app_ev_manager * object, const char * appsym);
-void * app_thread_crash_monitor(void * arg); \ No newline at end of file
diff --git a/runtime/src/app.c b/runtime/src/app.c
deleted file mode 100644
index ceddc38..0000000
--- a/runtime/src/app.c
+++ /dev/null
@@ -1,655 +0,0 @@
-/* Application, Process and Dataplane Manager
- *
- * This manager is used to manage application, process and thread.
- * It gives one unique id for each application, process and dataplane thread.
- *
- * Author : Lu Qiuwen<[email protected]>
- * Date : 2016-08-19
- */
-
-#include <sys/queue.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <mr_common.h>
-#include <mr_mask.h>
-#include <mr_runtime.h>
-
-#include <rte_malloc.h>
-#include <rte_rwlock.h>
-#include <rte_lcore.h>
-#include <rte_per_lcore.h>
-#include <assert.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-
-struct appinfo
-{
- /* 下一个 */
- TAILQ_ENTRY(appinfo) next;
- /* 应用标识符 */
- char symbol[MR_SYMBOL_MAX];
- /* 应用序号 */
- app_id_t app_id;
- /* 全局线程序号,起始序号,左闭右开 */
- thread_id_t gsid_start;
- /* 全局线程序号,终止序号,左闭右开 */
- thread_id_t gsid_end;
- /* 进程状态 */
- volatile unsigned int state;
- /* 运行的线程信息 */
- struct thread_info * thread_info;
- /* CPU绑定掩码 */
- cpu_mask_t cpu_mask;
- /* 进程最大数据面线程数量 */
- unsigned int nr_max_thread;
- /* 目前分配的线程序号 */
- unsigned int cur_sid;
- /* 目前分配的全局线程序号 */
- unsigned int cur_gsid;
- /* 应用私有句柄 */
- void * priv;
-};
-
-struct thread_info
-{
- /* 线程顺序号 */
- thread_id_t sid;
- /* 全局线程顺序号 */
- thread_id_t gsid;
- /* 进程号 */
- thread_id_t proc_id;
- /* 物理CPU序号 */
- cpu_id_t cpu_id;
- /* 物理NUMA节点序号 */
- socket_id_t socket_id;
- /* 进程私有上下文 */
- void * priv;
- /* 标志位,当前线程是否运行 */
- unsigned int in_use;
-};
-
-/* 当前运行应用的描述符 */
-static struct appinfo * currect_app_info = NULL;
-/* 当前线程描述符 */
-static __thread struct thread_info * currect_thread_info = NULL;
-
-TAILQ_HEAD(appinfo_list, appinfo);
-
-struct app_manager
-{
- /* 读写锁,控制并发访问 */
- mr_spinlock_t lock;
- /* 进程列表 */
- struct appinfo_list appinfo_list;
- /* 在册进程数量 */
- unsigned int nr_app;
-};
-
-struct app_manager * app_manager_create()
-{
- struct app_manager * object = rte_zmalloc(NULL, sizeof(struct app_manager), 0);
- MR_CHECK(object != NULL, "AppObjectCreate, Cannot alloc memory for app manager");
-
- object->nr_app = 0;
- mr_spin_init(&object->lock);
- TAILQ_INIT(&object->appinfo_list);
- return object;
-}
-
-//TODO: 应用管理器销毁
-int app_manager_destory(struct app_manager * object)
-{
- return 0;
-}
-
-/* 应用运行 */
-static int __rte_unused __app_run_unsafe(struct app_manager * object, struct appinfo * pinfo)
-{
- return 0;
-}
-
-/* 应用挂起,保留上下文 */
-static int __rte_unused __app_suspend_unsafe(struct app_manager * object, struct appinfo * pinfo)
-{
- return 0;
-}
-
-/* 应用退出,销毁上下文 */
-static int __rte_unused __app_exit_unsafe(struct app_manager * object, struct appinfo * pinfo)
-{
- return 0;
-}
-
-static struct appinfo * __appinfo_lookup_unsafe(const struct app_manager * object,
- const char * sym)
-{
- struct appinfo * pinfo_iter = NULL;
- struct appinfo * pinfo_ret = NULL;
-
- TAILQ_FOREACH(pinfo_iter, &object->appinfo_list, next)
- {
- if(strncmp(pinfo_iter->symbol, sym, sizeof(pinfo_iter->symbol)) == 0)
- {
- pinfo_ret = pinfo_iter;
- break;
- }
- }
-
- return pinfo_ret;
-}
-
-/* 删除一个进程 */
-static int __appinfo_delete_unsafe(struct app_manager * object,
- struct appinfo * pinfo)
-{
- // 检查进程所属的线程是否全部退出。线程全部退出后才允许销毁这个进程
- for(int i = 0; i < pinfo->nr_max_thread; i++)
- {
- if (pinfo->thread_info[i].in_use == 0) continue;
- // 检查失败,有一个或多个线程仍然在使用
- MR_LOG(INFO, BASE, "AppInfo, AppInfoDelete, "
- "Thread %d in use, cannot delete app %s. \n",
- pinfo->thread_info[i].sid, pinfo->symbol);
- return -1;
- }
-
- // 回收应用序号和全局线程号
- mr_id_manager_release_app_id(pinfo->app_id);
- mr_id_manager_release_gsid(pinfo->gsid_start, pinfo->nr_max_thread);
-
- // 移除AppInfo,释放资源
- TAILQ_REMOVE(&object->appinfo_list, pinfo, next);
- object->nr_app--;
- rte_free(pinfo->thread_info);
- rte_free(pinfo);
-
- // 当前的应用信息置空
- currect_app_info = NULL;
- return 0;
-}
-
-
-/* 创建一个新的进程 */
-static int __appinfo_new_unsafe(struct app_manager * object, const char * sym,
- cpu_mask_t cpu_mask, unsigned int nr_max_thread)
-{
- struct appinfo * pinfo;
- int ret = 0;
-
- // 检查进程是否已经存在
- pinfo = __appinfo_lookup_unsafe(object, sym);
- if (pinfo != NULL)
- {
- MR_LOG(INFO, BASE, "AppInfo, AppInfoNew, "
- "Application %s is already exists, failed. \n", sym);
- ret = -1; goto out;
- }
-
- // 进程不存在,创建新的描述符
- pinfo = (struct appinfo *)rte_zmalloc(NULL, sizeof(struct appinfo), 0);
- if (unlikely(pinfo == NULL))
- {
- MR_LOG(INFO, BASE, "AppInfo, AppInfoNew, "
- "Cannot alloc appinfo mem for app %s info.\n", sym);
- ret = -2; goto errout;
- }
-
- // 填充进程信息
- snprintf(pinfo->symbol, sizeof(pinfo->symbol), "%s", sym);
-
- // 申请应用序号
- app_id_t app_id;
- ret = mr_id_manager_apply_app_id(&app_id);
- if(unlikely(ret < 0))
- {
- MR_LOG(INFO, BASE, "AppInfo, AppInfoNew, "
- "Cannot apply app_id for app %s. \n", sym);
- ret = -3; goto errout;
- }
-
- // 申请全局线程号
- thread_id_t gsid_start;
- ret = mr_id_manager_apply_gsid(nr_max_thread, &gsid_start);
- if(unlikely(ret < 0))
- {
- MR_LOG(INFO, BASE, "AppInfo, AppInfoNew, "
- "Cannot apply gsid for app %s. \n", sym);
- ret = -4; goto errout;
- }
-
- // 计算全局线程号终止序号,全局线程号在单个应用内是连续的
- thread_id_t gsid_end = gsid_start + nr_max_thread;
-
- pinfo->app_id = app_id;
- pinfo->gsid_start = gsid_start;
- pinfo->gsid_end = gsid_end;
- pinfo->cpu_mask = cpu_mask;
- pinfo->nr_max_thread = nr_max_thread;
-
- // 插入到应用链表
- TAILQ_INSERT_TAIL(&object->appinfo_list, pinfo, next);
-
- // 初始化线程
- pinfo->thread_info = (struct thread_info *)rte_zmalloc(NULL,
- sizeof(struct thread_info)*nr_max_thread, 0);
-
- if (pinfo->thread_info == NULL)
- {
- MR_LOG(INFO, BASE, "AppInfo, AppInfoNew, "
- "Cannot alloc memory for thread_info sturcture, failed\n");
- ret = -5; goto errout;
- }
-
- pinfo->cur_sid = 0;
- pinfo->cur_gsid = pinfo->gsid_start;
- ret = 0; goto out;
-
-errout:
- if (pinfo != NULL) rte_free(pinfo);
- goto out;
-
-out:
- return ret;
-}
-
-struct thread_info * __thread_new_unsafe(struct appinfo * pinfo)
-{
- struct thread_info * tinfo;
- tinfo = &pinfo->thread_info[pinfo->cur_sid];
-
- // 分配线程序号,全局序号和上下文空间
- tinfo->proc_id = pinfo->app_id;
- tinfo->sid = pinfo->cur_sid;
- tinfo->gsid = pinfo->cur_gsid;
- tinfo->priv = NULL;
-
- // 增加线程计数
- pinfo->cur_sid++;
- pinfo->cur_gsid++;
- return tinfo;
-}
-
-//TODO: 线程Recover机制:线程正常(或异常)退出之后,如何恢复上下文空间。
-struct thread_info * __thread_lookup_unsafe(struct appinfo * pinfo, thread_id_t sid)
-{
- if (sid < pinfo->cur_sid)
- return &pinfo->thread_info[sid];
- return NULL;
-}
-
-int __set_affinity(unsigned int cpu_id)
-{
- cpu_set_t _cpu_set;
- CPU_ZERO(&_cpu_set);
- CPU_SET(cpu_id, &_cpu_set);
-
- pthread_t ppid = pthread_self();
- int ret = pthread_setaffinity_np(ppid, sizeof(cpu_mask_t), &_cpu_set);
- return ret;
-}
-
-int __thread_set_affinity(struct appinfo * pinfo,
- struct thread_info * tinfo)
-{
- cpu_id_t cpu_id = mask_location(pinfo->cpu_mask, tinfo->sid);
-
- if (unlikely(cpu_id >= mr_hwinfo_nr_cpus()))
- {
- MR_LOG(INFO, BASE, "Procman, ThreadSetAffinity, "
- "Thread %d in Process %s, Invalided CPU_ID %d "
- "(Exceed Physical CPU Count %d)\n",
- tinfo->sid, pinfo->symbol, cpu_id, mr_hwinfo_nr_cpus());
- return -1;
- }
-
- if(unlikely(cpu_id < 0))
- {
- MR_LOG(INFO, BASE, "AppInfo, ThreadSetAffinity, "
- "Thread %d in Process %s, Invailided CPU_ID %d"
- "(Invailed CPU Mask or SID)\n", tinfo->sid,
- pinfo->symbol, cpu_id);
- return -2;
- }
-
- socket_id_t socket_id = mr_hwinfo_socket_id(cpu_id);
- assert(socket_id >= 0 && socket_id < mr_hwinfo_nr_sockets());
-
- if(__set_affinity(cpu_id) != 0)
- {
- MR_LOG(INFO, BASE, "AppInfo, ThreadSetAffinity, "
- "Thread %d in Process %s, Call Pthread Error : %s\n",
- tinfo->cpu_id, pinfo->symbol, strerror(errno));
- return -3;
- }
-
- tinfo->cpu_id = cpu_id;
- tinfo->socket_id = socket_id;
- return 0;
-}
-
-int __thread_register_unsafe(struct appinfo * pinfo, thread_id_t suppose_sid)
-{
- struct thread_info * tinfo;
-
- // 查找当前的SID是否已经注册过
- tinfo = __thread_lookup_unsafe(pinfo, suppose_sid);
-
- // 没有注册过,注册一个新的线程
- if (tinfo != NULL)
- {
- MR_LOG(INFO, BASE, "Thread %d in Application %s existed, recoverd.\n",
- suppose_sid, pinfo->symbol);
- }
- else
- {
- MR_LOG(INFO, BASE, "Thread %d in Application %s registed as a new thread. \n",
- suppose_sid, pinfo->symbol);
- tinfo = __thread_new_unsafe(pinfo);
- }
-
- // 检测tinfo是否为空,此时为空就是异常情况了
- if(unlikely(tinfo == NULL))
- {
- MR_LOG(WARNING, BASE, "Thread %d in Application %s Info Structure is NULL, failed.\n",
- suppose_sid, pinfo->symbol);
- return -1;
- }
-
- // 注册上下文空间
- RTE_PER_LCORE(_lcore_id) = tinfo->gsid;
- currect_thread_info = tinfo;
-
- if(__thread_set_affinity(pinfo, tinfo) < 0)
- {
- MR_LOG(WARNING, BASE, "Thread %d in Application %s, SetThreadAffinity failed.\n",
- tinfo->sid, pinfo->symbol);
- return -2;
- }
-
- MR_LOG(DEBUG, BASE, "Thread Registered (ThreadID=%d, GThreadID=%d, App=%s). \n",
- tinfo->sid, tinfo->gsid, pinfo->symbol);
-
- return 0;
-}
-
-int __thread_unregister_unsafe()
-{
- assert(currect_thread_info != NULL);
- currect_thread_info->in_use = 0;
- return 0;
-}
-
-int app_manager_appinfo_create(struct app_manager * object,
- const char * sym, cpu_mask_t cpu_mask)
-{
- int nr_max_thread = mask_popcnt(cpu_mask);
- if (unlikely(nr_max_thread < 0))
- {
- MR_LOG(WARNING, BASE, "AppInfo, AppInfoNew, "
- "Process %s CPU Mask error(mask=%"PRIx64", nr_max_thread=%d)\n",
- sym, cpu_mask, nr_max_thread);
- return -1;
- }
-
- mr_spin_lock(&object->lock);
- int ret = __appinfo_new_unsafe(object, sym, cpu_mask, nr_max_thread);
- mr_spin_unlock(&object->lock);
- return ret;
-}
-
-void __release_spin_lock(void * lock)
-{
- if (rte_spinlock_is_locked(lock)) rte_spinlock_unlock(lock);
-}
-
-int app_manager_appinfo_register(struct app_manager * object,
- const char * sym, cpu_mask_t cpu_mask)
-{
- struct appinfo * pinfo;
- int ret = 0;
-
- // 注册线程退出处理函数,释放锁
- pthread_cleanup_push_defer_np(__release_spin_lock, &object->lock);
- mr_spin_lock(&object->lock);
-
- // 查找应用是否以前注册过
- pinfo = __appinfo_lookup_unsafe(object, sym);
-
- // 应用已经存在,跳过创建过程进入后续流程
- if (pinfo != NULL) goto after_create;
-
- // 创建应用
- int nr_max_thread = mask_popcnt(cpu_mask);
- if(nr_max_thread == 0)
- {
- MR_LOG(WARNING, BASE, "AppInfo, AppInfoNew, "
- "App %s CPU Mask error(mask=%"PRIx64", nr_max_thread=%d)\n",
- sym, cpu_mask, nr_max_thread);
- ret = -1; goto out;
- }
-
- ret = __appinfo_new_unsafe(object, sym, cpu_mask, nr_max_thread);
- if (unlikely(ret < 0)) goto out;
-
- // 成功创建,再次查找描述符
- pinfo = __appinfo_lookup_unsafe(object, sym);
- assert(pinfo != NULL);
-
-after_create:
- __app_run_unsafe(object, pinfo);
- currect_app_info = pinfo;
-
-out:
- mr_spin_unlock(&object->lock);
- pthread_cleanup_pop_restore_np(0);
-
- return ret;
-}
-
-// 应用反注册流程
-int app_manager_appinfo_unregister(struct app_manager * object)
-{
- struct appinfo * pinfo = currect_app_info;
- if (pinfo == NULL) return -1;
-
- int ret = 0;
-
- // 注册线程退出处理函数,释放锁
- pthread_cleanup_push_defer_np(__release_spin_lock, &object->lock);
- mr_spin_lock(&object->lock);
- ret = __appinfo_delete_unsafe(object, pinfo);
- mr_spin_unlock(&object->lock);
- pthread_cleanup_pop_restore_np(0);
-
- // 反注册成功,当前APPInfo指针置空,防止再次引用。
- if (ret >= 0) currect_app_info = NULL;
- return ret;
-}
-
-#if 0
-typedef void(*app_event_cb_t)(int app_event, const char * appsym,
- struct appinfo * appinfo, void * arg);
-#endif
-
-void app_mamager_crash_event_handler(int app_event, const char * appsym,
- struct appinfo * appinfo, void * arg)
-{
- struct app_manager * object = (struct app_manager *)arg;
-
- mr_spin_lock(&object->lock);
- __appinfo_delete_unsafe(object, appinfo);
- mr_spin_unlock(&object->lock);
-}
-
-int app_manager_thread_register(struct app_manager * object)
-{
- struct appinfo * pinfo = currect_app_info;
-
- // 进程重启后,原来的线程可能注册过。因此设置一个变量supposed_sid
- // 在进程重启后清零。如果线程号以前注册过,就不再创建线程的描述符
- // 直接恢复就可以了。因此,需要两个计数器,一个全局共享,表示多少
- // 个线程已经创建描述符,另一个计数器用于进程恢复,表示当前进程的
- // 线程计数。
- // supposed_sid在临界区中访问,不存在线程安全问题。
-
- static thread_id_t suppose_sid = 0;
- int ret = 0;
-
- pthread_cleanup_push_defer_np(__release_spin_lock, &object->lock);
- mr_spin_lock(&object->lock);
- ret = __thread_register_unsafe(pinfo, suppose_sid);
- if (ret >= 0) suppose_sid++;
- mr_spin_unlock(&object->lock);
- pthread_cleanup_pop_restore_np(0);
-
- return ret;
-}
-
-int app_manager_thread_unregister(struct app_manager * object)
-{
- int ret = 0;
-
- pthread_cleanup_push_defer_np(__release_spin_lock, &object->lock);
- mr_spin_lock(&object->lock);
- ret = __thread_unregister_unsafe();
- mr_spin_unlock(&object->lock);
- pthread_cleanup_pop_restore_np(0);
- return ret;
-}
-
-int app_manager_appinfo_iterate(struct app_manager * object, struct appinfo ** appinfo)
-{
- // 迭代器为空,从头开始迭代,否则查找迭代器下一个对象
- if (*appinfo == NULL)
- {
- *appinfo = TAILQ_FIRST(&object->appinfo_list);
- return 0;
- }
- else
- {
- *appinfo = TAILQ_NEXT(*appinfo, next);
- }
-
- // 迭代到尾部,返回错误码
- if (*appinfo == NULL) return -ENOENT;
- return 0;
-}
-
-int app_manager_list_all_appinfo(struct app_manager * object,
- struct appinfo * infos[], int nr_max_infos)
-{
- struct appinfo * pinfo_iter;
- int ret = 0;
-
- mr_spin_lock(&object->lock);
- TAILQ_FOREACH(pinfo_iter, &object->appinfo_list, next)
- {
- if (ret > nr_max_infos) break;
- infos[ret++] = pinfo_iter;
- }
-
- mr_spin_unlock(&object->lock);
- return ret;
-}
-
-struct appinfo * app_mamager_appinfo_lookup(struct app_manager * object,
- const char * appsym)
-{
- struct appinfo * result = NULL;
- mr_spin_lock(&object->lock);
- result = __appinfo_lookup_unsafe(object, appsym);
- mr_spin_unlock(&object->lock);
- return result;
-}
-
-int app_manager_tinfo_iterate(struct appinfo * appinfo,
- struct thread_info ** tinfo, int * iterate)
-{
- if (*iterate >= appinfo->nr_max_thread) return -ENOENT;
- *tinfo = &appinfo->thread_info[*iterate];
- return *iterate++;
-}
-
-
-// 外部接口,获取当前应用、线程的信息
-thread_id_t mr_thread_id()
-{
- assert(currect_thread_info != NULL);
- return currect_thread_info->sid;
-}
-
-thread_id_t mr_gsid_id()
-{
- assert(currect_thread_info != NULL);
- return currect_thread_info->gsid;
-}
-
-socket_id_t mr_socket_id()
-{
- assert(currect_thread_info != NULL);
- return currect_thread_info->socket_id;
-}
-
-cpu_id_t mr_cpu_id()
-{
- assert(currect_thread_info != NULL);
- return currect_thread_info->cpu_id;
-}
-
-app_id_t mr_app_id()
-{
- assert(currect_app_info != NULL);
- return currect_app_info->app_id;
-}
-
-app_id_t mr_appinfo_get_app_id(struct appinfo * appinfo)
-{
- return appinfo->app_id;
-}
-
-const char * mr_appinfo_get_symbol(struct appinfo * appinfo)
-{
- return appinfo->symbol;
-}
-
-unsigned int mr_appinfo_get_nr_max_thread(struct appinfo * appinfo)
-{
- return appinfo->nr_max_thread;
-}
-
-struct appinfo * mr_app_info_get()
-{
- return currect_app_info;
-}
-
-struct thread_info * mr_thread_info_get()
-{
- return currect_thread_info;
-}
-
-// 外部接口,读取(或写入)应用级、线程级私有句柄指针
-void * mr_app_priv_get()
-{
- assert(currect_app_info != NULL);
- return currect_app_info->priv;
-}
-
-void mr_app_priv_set(void * ptr)
-{
- assert(currect_app_info != NULL);
- currect_app_info->priv = ptr;
-}
-
-void * mr_thread_priv_get()
-{
- assert(currect_thread_info != NULL);
- return currect_thread_info->priv;
-}
-
-void mr_thread_priv_set(void * ptr)
-{
- assert(currect_thread_info != NULL);
- currect_thread_info->priv = ptr;
-} \ No newline at end of file
diff --git a/runtime/src/ctx.c b/runtime/src/ctx.c
deleted file mode 100644
index e82a142..0000000
--- a/runtime/src/ctx.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Core Functions of framework
- * Provides basic functions and envoirment.
- *
- * Author : Qiuwen Lu<[email protected]>
- * Date : 2016-08-23
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <rte_ip_frag.h>
-#include <rte_eal.h>
-#include <rte_version.h>
-#include <mr_common.h>
-#include <mr_runtime.h>
-
-static struct mr_global_ctx * __global_ctx;
-static struct mr_global_config * __global_cfg;
-
-#define __SHM_FILEMODE 00777
-#define __SHM_SYM_GLOBAL_CTX "MR_RUNTIME_GLOBAL_CTX_SHM"
-#define __SHM_SYM_GLOBAL_CFG "MR_RUNTIME_GLOBAL_CFG_SHM"
-
-static void * shared_memory_create(const char * sym, size_t size)
-{
- int shm_fd = shm_open(sym, O_RDWR | O_CREAT, __SHM_FILEMODE);
- if(shm_fd < 0)
- {
- MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryCreate, "
- "Call shm_open failed: %s\n", strerror(errno));
- return NULL;
- }
-
- ftruncate(shm_fd, size);
-
- void * shm_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
- MAP_SHARED, shm_fd, 0);
-
- if (shm_ptr == NULL)
- {
- MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryCreate, "
- "Call mmap failed: %s\n", strerror(errno));
- return NULL;
- }
-
- memset(shm_ptr, 0, size);
- return shm_ptr;
-}
-
-static void * shared_memory_lookup(const char * sym, size_t size)
-{
- int shm_fd = shm_open(sym, O_RDWR, __SHM_FILEMODE);
- if (shm_fd < 0)
- {
- MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryLookup, "
- "Call shm_open failed: %s\n", strerror(errno));
- return NULL;
- }
-
- ftruncate(shm_fd, size);
-
- void * shm_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
- MAP_SHARED, shm_fd, 0);
-
- if (shm_ptr == NULL)
- {
- MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryLookup, "
- "Call mmap failed: %s\n", strerror(errno));
- return NULL;
- }
-
- return shm_ptr;
-}
-
-int mr_global_ctx_init()
-{
- __global_ctx = (struct mr_global_ctx *)shared_memory_create(
- __SHM_SYM_GLOBAL_CTX, sizeof(struct mr_global_ctx));
-
- MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalCtxInit, "
- "Cannot create shared memory for global ctx");
- return 0;
-}
-
-int mr_global_ctx_slave_init()
-{
- __global_ctx = (struct mr_global_ctx *)shared_memory_lookup(
- __SHM_SYM_GLOBAL_CTX, sizeof(struct mr_global_ctx));
-
- MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalCtxLookup, "
- "Cannot lookup shared memory for global ctx");
- return 0;
-}
-
-int mr_global_cfg_init()
-{
- __global_cfg = (struct mr_global_config *)shared_memory_create(
- __SHM_SYM_GLOBAL_CFG, sizeof(struct mr_global_config));
-
- MR_CHECK(__global_cfg != NULL, "CoreCtxMan, GlobalConfigInit, "
- "Cannot create shared memory for global config");
-
- return 0;
-}
-
-int mr_global_cfg_slave_init()
-{
- __global_cfg = (struct mr_global_config *)shared_memory_lookup(
- __SHM_SYM_GLOBAL_CFG, sizeof(struct mr_global_config));
-
- MR_CHECK(__global_cfg != NULL, "CoreCtxMan, GlobalConfigLookup, "
- "Cannot lookup shared memory for global config");
- return 0;
-}
-
-struct mr_global_ctx * mr_global_ctx_get()
-{
- assert(__global_ctx != NULL);
- return __global_ctx;
-}
-
-struct mr_global_config * mr_global_config_get()
-{
- assert(__global_cfg != NULL);
- return __global_cfg;
-} \ No newline at end of file
diff --git a/runtime/src/event.c b/runtime/src/event.c
deleted file mode 100644
index c0e8f83..0000000
--- a/runtime/src/event.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/* \brief Ӧ�ó����쳣״̬������¼�֪ͨ
- *
- * ���Ӧ���쳣�˳�״̬����֪ͨ�����̸�ģ�����Ӧ��ʹ�õ���Դ
- * TODO: �ع����δ��룬֧�ָ�����첽�ź�֪ͨ����
- *
- * \author Qiuwen Lu<[email protected]>
- * \date 2016-12-09
- */
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <sys/epoll.h>
-#include <assert.h>
-#include <rte_malloc.h>
-#include <rte_devargs.h>
-
-#include <mr_common.h>
-#include <mr_runtime.h>
-#include <runtime.h>
-
-TAILQ_HEAD(crash_ev_raiser_list, crash_ev_raiser);
-TAILQ_HEAD(crash_ev_cb_list, crash_ev_cb);
-
-/* �����¼�Դ */
-struct crash_ev_raiser
-{
- TAILQ_ENTRY(crash_ev_raiser) next;
- struct appinfo * appinfo;
- char appsym[MR_SYMBOL_MAX];
- int connect_fd;
-};
-
-/* �����¼��������� */
-struct crash_ev_cb
-{
- TAILQ_ENTRY(crash_ev_cb) next;
- app_event_cb_t cb;
- void * arg;
-};
-
-/* �����¼�Դע��ָ�ͨ��TCP���䣩 */
-struct crash_raiser_reg_cmd
-{
- /* ���� */
- char symlen;
- /* ���� */
- char appsym[MR_SYMBOL_MAX];
-};
-
-struct app_ev_manager
-{
-#define __MAX_CRASH_CBS 64
-
- /* Rt��� */
- struct mr_runtime_ctx * rt_ctx;
- /* Ӧ�ñ����¼�Դ */
- struct crash_ev_raiser_list crash_ev_raiser_list;
- /* Ӧ�ñ����¼������ص����� */
- struct crash_ev_cb_list crash_ev_cb_list;
- /* Ӧ�ñ�������ַ */
- struct sockaddr_in crash_sockaddr;
-};
-
-struct app_ev_manager * app_ev_manager_create(struct mr_runtime_ctx * rt_ctx)
-{
- struct app_ev_manager * object = rte_zmalloc(NULL, sizeof(struct app_ev_manager), 0);
- MR_CHECK(object != NULL, "Cannot alloc memory for app event manager");
-
- object->rt_ctx = rt_ctx;
- TAILQ_INIT(&object->crash_ev_cb_list);
- TAILQ_INIT(&object->crash_ev_raiser_list);
- return object;
-}
-
-void app_ev_manager_destory(struct app_ev_manager * object)
-{
- rte_free(object);
-}
-
-/* ע������������� */
-int app_crash_cb_register(struct app_ev_manager * object, app_event_cb_t cb,
- void * arg)
-{
- struct crash_ev_cb * ev_cb = rte_zmalloc(NULL, sizeof(struct crash_ev_cb), 0);
- MR_CHECK(ev_cb != NULL, "Cannot alloc memory for crash_ev_cb");
-
- ev_cb->cb = cb;
- ev_cb->arg = arg;
- TAILQ_INSERT_TAIL(&object->crash_ev_cb_list, ev_cb, next);
- return 0;
-}
-
-/* ��������̣��������˳��������ӽ����˳� */
-void * app_crash_thread_monitor_service(void * arg)
-{
- intptr_t conn_fd = (intptr_t)arg;
- int ret = 0;
-
- char buf[MR_STRING_MAX];
-
- // �ȴ����ӽ���
- do {
- ret = recv(conn_fd, buf, sizeof(buf), 0);
- } while (ret == -1 && (errno == EINTR));
-
- // �������ӽ������������˳���
- if (ret == 0)
- {
- MR_LOG(ERR, BASE, "Service crashed, Exit the program.\n");
- close(conn_fd);
- exit(EXIT_FAILURE);
- }
-
- MR_LOG(ERR, BASE, "Crash monitor thread is exited. This is an error. \n");
- abort();
-
- return (void *)NULL;
-}
-
-/* ע������¼�Դ */
-int app_crash_raiser_register(struct app_ev_manager * object, const char * appsym)
-{
- int conn_fd = socket(AF_INET, SOCK_STREAM, 0);
- if (unlikely(conn_fd < 0))
- {
- MR_LOG(ERR, BASE, "Cannot create socket for crash raiser register : %s. \n",
- strerror(errno));
- return -1;
- }
-
- int ret = connect(conn_fd, (const struct sockaddr *)&object->crash_sockaddr,
- sizeof(object->crash_sockaddr));
-
- if (unlikely(ret < 0))
- {
- MR_LOG(ERR, BASE, "Connect to crash monitor failed : %s\n", strerror(errno));
- return -2;
- }
-
- pthread_t monitor;
- ret = pthread_create(&monitor, NULL, app_crash_thread_monitor_service, (void *)(intptr_t)conn_fd);
- if(ret < 0)
- {
- MR_LOG(ERR, BASE, "Create crash monitor thread failed : %s\n", strerror(errno));
- return -3;
- }
-
- struct crash_raiser_reg_cmd reg_cmd;
- snprintf(reg_cmd.appsym, sizeof(reg_cmd.appsym), "%s", appsym);
- reg_cmd.symlen = strlen(reg_cmd.appsym);
-
- do {
- ret = send(conn_fd, &reg_cmd, sizeof(reg_cmd), MSG_NOSIGNAL);
- } while (ret == -1 && (errno == EINTR));
-
- assert(ret == sizeof(reg_cmd));
- return 0;
-}
-
-/* �¼���������ע��Ӧ�� */
-static int app_crash_handle_new_raiser(struct app_ev_manager * object,
- const char * appsym, int conn_fd)
-{
- struct mr_runtime_ctx * rt_ctx = object->rt_ctx;
- struct app_manager * app_manager = rt_ctx->app_ctx;
-
- struct appinfo * appinfo = app_mamager_appinfo_lookup(app_manager, appsym);
- if (appinfo == NULL)
- {
- MR_LOG(ERR, BASE, "Application %s does not existed, "
- "cannot monitor its crash state. \n", appsym);
- return -1;
- }
-
- struct crash_ev_raiser * raiser;
-
-#ifndef _NDEBUG
- TAILQ_FOREACH(raiser, &object->crash_ev_raiser_list, next)
- {
- assert(strcmp(raiser->appsym, appsym) != 0);
- }
-#endif
-
- raiser = rte_zmalloc(NULL, sizeof(struct crash_ev_raiser), 0);
- MR_CHECK(raiser != NULL, "Cannot alloc memory for crash raiser. ");
-
- snprintf(raiser->appsym, sizeof(raiser->appsym), "%s", appsym);
- raiser->appinfo = appinfo;
- raiser->connect_fd = conn_fd;
- TAILQ_INSERT_TAIL(&object->crash_ev_raiser_list, raiser, next);
-
- MR_LOG(INFO, BASE, "Crash raiser from application %s registed. \n", appsym);
- return 0;
-}
-
-/* �¼�������Ӧ�ñ��� */
-static int app_crash_handle_crash_raiser(struct app_ev_manager * object,
- struct crash_ev_raiser * raiser)
-{
- MR_LOG(INFO, BASE, "Crash raise from applicaion %s. \n", raiser->appsym);
-
- struct crash_ev_cb * cb;
- TAILQ_FOREACH(cb, &object->crash_ev_cb_list, next)
- {
- cb->cb(0, raiser->appsym, raiser->appinfo, cb->arg);
- }
-
- TAILQ_REMOVE(&object->crash_ev_raiser_list, raiser, next);
- rte_free(raiser);
- return 0;
-}
-
-#define __LISTEN_PORT_START 1024
-#define __LISTEN_PORT_END 65535
-#define __LISTEN_BACKEND 16
-
-static int __create_ev_listenfd(struct sockaddr_in * sockaddr_in)
-{
- int try_times_max = 36;
- int success = 0;
-
- // �������ض˿ڣ�TCP����
- int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
- if(unlikely(listen_fd < 0))
- {
- MR_LOG(ERR, BASE, "Create crash monitor listen fd failed : %s. \n",
- strerror(errno));
- goto out;
- }
-
- int reuse = 1;
- if (unlikely(setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR,
- (const void*)&reuse, sizeof(int)) < 0))
- {
- MR_LOG(ERR, BASE, "Set crash monitor listen fd reuse failed : %s\n",
- strerror(errno));
- goto out;
- }
-
- while (try_times_max >= 0)
- {
- unsigned int random_port;
-
- // ���ѡ��һ�������˿ڣ����ؼ���
- random_port = rand() % (__LISTEN_PORT_END - __LISTEN_PORT_START) + __LISTEN_PORT_START;
- assert(random_port >= __LISTEN_PORT_START && random_port <= __LISTEN_PORT_END);
-
- memset(sockaddr_in, 0, sizeof(struct sockaddr_in));
- sockaddr_in->sin_family = AF_INET;
- sockaddr_in->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- sockaddr_in->sin_port = htons(random_port);
-
- int ret = bind(listen_fd, (struct sockaddr *)sockaddr_in,
- sizeof(struct sockaddr_in));
-
- // �˿ڱ�ռ�ã�����ѡ��һ�����õĶ˿�
- if (ret < 0 && errno == EADDRINUSE)
- {
- try_times_max--;
- continue;
- }
-
- // ��������
- else if (ret < 0)
- {
- MR_LOG(ERR, BASE, "Bind crash monitor listen fd(PORT=%d) failed : %s.\n",
- random_port, strerror(errno));
- goto out;
- }
-
- ret = listen(listen_fd, 20);
- if(ret < 0)
- {
- MR_LOG(ERR, BASE, "Listen crash monitor listen fd(PORT=%d) failed : %s.\n",
- random_port, strerror(errno));
- goto out;
- }
-
- success = 1;
- break;
- }
-
- if(success)
- {
- MR_LOG(INFO, BASE, "Crash monitor listen tcp fd(port=%d) create success.\n",
- ntohs(sockaddr_in->sin_port));
- return listen_fd;
- }
-
-out:
- if (listen_fd > 0) close(listen_fd);
- return -1;
-}
-
-#define __EV_MAX_EVENTS 16
-#define __EV_MAX_BUFFER 2048
-
-
-// ���¹��ߺ�����MESATCP�н�ȡ
-static int __tcp_setnonblock(int sockfd)
-{
- int flags = fcntl(sockfd, F_GETFL, 0);
- if (flags == -1) return -1;
- int ret = fcntl(sockfd, F_SETFL, flags | O_NONBLOCK, 0);
- if (ret == -1) return -1;
- return 0;
-}
-
-static int __update_epoll_event(int epoll_fd, int epoll_mode, int fd, int epoll_type)
-{
- struct epoll_event event = { 0 };
- event.data.fd = fd;
- event.events = epoll_type;
-
- __tcp_setnonblock(fd);
- if (-1 == epoll_ctl(epoll_fd, epoll_mode, fd, &event))
- {
- MR_LOG(ERR, BASE, "update epoll event failed : %s\n",
- strerror(errno)); return -1;
- }
-
- return 0;
-}
-
-int __epoll_add_event(int epoll_fd, int sd, int epoll_type)
-{
- return __update_epoll_event(epoll_fd, EPOLL_CTL_ADD, sd, epoll_type);
-}
-
-int __epoll_del_event(int epoll_fd, int sd, int epoll_type)
-{
- return __update_epoll_event(epoll_fd, EPOLL_CTL_DEL, sd, epoll_type);
-}
-
-int __epoll_mod_event(int epoll_fd, int sd, int epoll_type)
-{
- return __update_epoll_event(epoll_fd, EPOLL_CTL_MOD, sd, epoll_type);
-}
-
-/* �����½��ļ������� */
-void __handle_accept(struct app_ev_manager * object, int epoll_fd, int listen_fd)
-{
- struct sockaddr_in remote_addr;
- socklen_t sz_remote_addr = sizeof(remote_addr);
-
- int conn_fd = accept(listen_fd, (struct sockaddr *)&remote_addr, &sz_remote_addr);
- if(conn_fd < 0)
- {
- MR_LOG(ERR, BASE, "Accept remote connnection failed : %s", strerror(errno));
- return;
- }
-
- __epoll_add_event(epoll_fd, conn_fd, EPOLLIN);
- return;
-}
-
-// �������ӹر���Ϣ�����ӹرմ���Ӧ�ñ���
-void __handle_close(struct app_ev_manager * object, int epoll_fd, int fd)
-{
- struct crash_ev_raiser * raiser_iter;
- TAILQ_FOREACH(raiser_iter, &object->crash_ev_raiser_list, next)
- {
- if (raiser_iter->connect_fd != fd) continue;
- app_crash_handle_crash_raiser(object, raiser_iter);
- }
-
- __epoll_del_event(epoll_fd, fd, EPOLLIN);
- close(fd);
- return;
-}
-
-/* �����������ӵ�������� */
-void __handle_read(struct app_ev_manager * object, int epoll_fd, int fd)
-{
- // ���뻺��������������С����ָ���
- char __read_buffer[sizeof(struct crash_raiser_reg_cmd)];
- ssize_t __read_buffer_used = 0;
- ssize_t ret = 0;
-
- while ((ret = read(fd, __read_buffer + __read_buffer_used,
- sizeof(__read_buffer) - __read_buffer_used)) > 0)
- {
- __read_buffer_used += ret;
- }
-
- // ���ݶ���������ָ��
- if(__read_buffer_used == sizeof(struct crash_raiser_reg_cmd))
- {
- struct crash_raiser_reg_cmd * cmd = (struct crash_raiser_reg_cmd *)__read_buffer;
- if (cmd->symlen != strnlen(cmd->appsym, sizeof(cmd->appsym))) return;
- app_crash_handle_new_raiser(object, cmd->appsym, fd);
- return;
- }
-
- if(ret < 0 && (errno == EWOULDBLOCK || errno == EAGAIN))
- {
- return;
- }
-
- if (ret == 0)
- {
- __handle_close(object, epoll_fd, fd);
- return;
- }
-
- //TODO: ���������������
- assert(0);
- return;
-}
-
-/* ��������߳� */
-//TODO: ���Epoll��ͨ�Ż��ƣ������Libevent��
-
-void * app_thread_crash_monitor(void * arg)
-{
- struct app_ev_manager * object = (struct app_ev_manager *)arg;
- pthread_detach(pthread_self());
-
- int listen_fd = __create_ev_listenfd(&object->crash_sockaddr);
- if(listen_fd < 0)
- {
- MR_LOG(ERR, BASE, "Launch crash monitor thread failed : "
- "Cannot create listen fd. \n"); goto errout;
- }
-
- int epoll_fd = epoll_create(16);
- if(epoll_fd < 0)
- {
- MR_LOG(ERR, BASE, "Launch crash monitor thread failed : "
- "Cannot create epoll fd. \n"); goto errout;
- }
-
- struct epoll_event evlist[__EV_MAX_EVENTS];
- struct epoll_event ev;
-
- ev.events = EPOLLIN;
- ev.data.fd = listen_fd;
- if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev) < 0)
- {
- MR_LOG(ERR, BASE, "Crash monitor thread failed : "
- "Add listenfd to epoll list error : %s \n", strerror(errno));
- goto errout;
- }
-
- while(1)
- {
- int ret = epoll_wait(epoll_fd, evlist, __EV_MAX_EVENTS, -1);
- if (ret == -1 && errno == EINTR) continue;
- else if(ret == -1)
- {
- MR_LOG(ERR, BASE, "Crash monitor thread failed : "
- "waiting on epoll fd : %s", strerror(errno));
- goto errout;
- }
-
- for(int i = 0; i < ret; i++)
- {
- int fd = evlist[i].data.fd;
- if(evlist[i].events & EPOLLIN)
- {
- if (fd == listen_fd) __handle_accept(object, epoll_fd, fd);
- else __handle_read(object, epoll_fd, fd);
- continue;
- }
-
- if(evlist[i].events & ( EPOLLHUP | EPOLLERR))
- {
- __handle_close(object, epoll_fd, fd);
- }
- }
- }
-
-errout:
- MR_LOG(ERR, BASE, "Crash monitor thread is exiting. \n");
- return (void *)NULL;
-} \ No newline at end of file
diff --git a/runtime/src/export.c b/runtime/src/export.c
deleted file mode 100644
index a4b755a..0000000
--- a/runtime/src/export.c
+++ /dev/null
@@ -1,120 +0,0 @@
-
-#include <mr_runtime.h>
-#include <runtime.h>
-
-// Ӳ��������Ϣ�����������û����ⲿ���á����ú��ҵ���Ӧ��object����Ȼ���ٵ����ڲ�������
-int mr_hwinfo_nr_sockets()
-{
- 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 hwinfo_nr_sockets(rt_ctx->hwinfo_ctx);
-}
-
-int mr_hwinfo_nr_cpus()
-{
- 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 hwinfo_nr_cpus(rt_ctx->hwinfo_ctx);
-}
-
-int mr_hwinfo_physical_cpu_id(int cpu_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 hwinfo_physical_cpu_id(rt_ctx->hwinfo_ctx, cpu_id);
-}
-
-int mr_hwinfo_socket_id(int cpu_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 hwinfo_socket_id(rt_ctx->hwinfo_ctx, cpu_id);
-}
-
-// Ӧ�ù�������������ͬӲ��������Ϣ������
-int mr_app_manager_appinfo_create(const char * sym, cpu_mask_t cpu_mask)
-{
- 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 app_manager_appinfo_create(rt_ctx->app_ctx, sym, cpu_mask);
-}
-
-int mr_app_manager_appinfo_register(const char * sym, cpu_mask_t cpu_mask)
-{
- 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 app_manager_appinfo_register(rt_ctx->app_ctx, sym, cpu_mask);
-}
-
-int mr_app_manager_appinfo_unregister()
-{
- 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 app_manager_appinfo_unregister(rt_ctx->app_ctx);
-}
-
-int mr_app_manager_thread_register()
-{
- 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 app_manager_thread_register(rt_ctx->app_ctx);
-}
-
-int mr_app_manager_thread_unregister()
-{
- 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 app_manager_thread_unregister(rt_ctx->app_ctx);
-}
-
-int mr_app_manager_appinfo_iterate(struct appinfo ** appinfo)
-{
- 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 app_manager_appinfo_iterate(rt_ctx->app_ctx, appinfo);
-}
-
-// ���������������
-int mr_id_manager_apply_app_id(app_id_t * result)
-{
- 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, result);
-}
-
-int mr_id_manager_release_app_id(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(rt_ctx->id_ctx, app_id);
-}
-
-int mr_id_manager_apply_gsid(int nr_thread, thread_id_t * result)
-{
- 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(rt_ctx->id_ctx, nr_thread, result);
-}
-
-int mr_id_manager_release_gsid(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(rt_ctx->id_ctx, start_gsid, nr_thread);
-}
-
-// ������⵼������
-int mr_app_crash_cb_register(app_event_cb_t cb, void * arg)
-{
- 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 app_crash_cb_register(rt_ctx->ev_ctx, cb, arg);
-}
-
-int mr_app_crash_raiser_register(const char * appsym)
-{
- 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 app_crash_raiser_register(rt_ctx->ev_ctx, appsym);
-} \ No newline at end of file
diff --git a/runtime/src/id.c b/runtime/src/id.c
deleted file mode 100644
index 380d774..0000000
--- a/runtime/src/id.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* \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;
-}
-
-int id_manager_apply_app_id(struct id_manager* object, app_id_t* result)
-{
- 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);
- *result = id;
- 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;
-}
-
-int id_manager_apply_gsid(struct id_manager* object, int nr_thread, thread_id_t* result)
-{
- 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);
- *result = gsid_start;
- 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
deleted file mode 100644
index fccf629..0000000
--- a/runtime/src/runtime.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* \brief MARSIO运行时环境管理器
- *
- * 运行时环境管理器提供重要的基础设施服务,包括:
- * (1)全局共享内存映射及管理;
- * (2)应用及应用数据面线程管理。
- *
- * \author Qiuwen Lu<[email protected]>
- * \date 2016-10-19
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <mr_common.h>
-#include <mr_runtime.h>
-#include <rte_malloc.h>
-
-#include <runtime.h>
-#include <signal.h>
-#include <sys/select.h>
-#include <sys/signalfd.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-void mr_runtime_init()
-{
- int ret = mr_global_ctx_init();
- MR_CHECK(ret >= 0, "RuntimeInit, Initialize global ctx failed(ret = %d). ", ret);
- ret = mr_global_cfg_init();
- MR_CHECK(ret >= 0, "RuntimeInit, Initialize global config failed(ret = %d). ", ret);
-
- struct mr_global_ctx * g_ctx = mr_global_ctx_get();
- assert(g_ctx != NULL);
-
- struct mr_runtime_ctx * rt_ctx;
- rt_ctx = rte_zmalloc("RuntimeCtx", sizeof(struct mr_runtime_ctx), 0);
- MR_CHECK(rt_ctx != NULL, "RuntimeInit, Cannot alloc memory for runtime ctx.");
-
- rt_ctx->app_ctx = app_manager_create();
- MR_CHECK(rt_ctx->app_ctx != NULL, "RuntimeInit, App manager initialize failed. ");
-
- rt_ctx->hwinfo_ctx = hwinfo_init();
- 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. ");
-
- rt_ctx->ev_ctx = app_ev_manager_create(rt_ctx);
- MR_CHECK(rt_ctx->ev_ctx != NULL, "RuntimeInit, App event initialize failed. ");
-
- g_ctx->ctx_runtime = rt_ctx;
- return;
-}
-
-void mr_runtime_start()
-{
- struct mr_global_ctx * g_ctx = mr_global_ctx_get();
- struct mr_runtime_ctx * rt_ctx = g_ctx->ctx_runtime;
-
- pthread_t pid_crash_monitor;
- pthread_create(&pid_crash_monitor, NULL, app_thread_crash_monitor, (void *)rt_ctx->ev_ctx);
- app_crash_cb_register(rt_ctx->ev_ctx, app_mamager_crash_event_handler, rt_ctx->app_ctx);
-}
-
-void mr_runtime_slave_init()
-{
- int ret = mr_global_ctx_slave_init();
- MR_CHECK(ret >= 0, "RuntimeSlaveInit, Initialize global ctx failed(ret = %d). ", ret);
-
- ret = mr_global_cfg_slave_init();
- MR_CHECK(ret >= 0, "RuntimeSlaveInit, Initialize global config failed(ret = %d). ", ret);
-
- struct mr_global_ctx * g_ctx = mr_global_ctx_get();
- assert(g_ctx != NULL);
-
- struct mr_runtime_ctx * rt_ctx = (struct mr_runtime_ctx *)g_ctx->ctx_runtime;
- RTE_SET_USED(rt_ctx);
-
- 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;
-}
-
-// 是否自动退出:处理信号和exit函数
-static int autoexit = 0;
-
-struct exit_handler
-{
- void(* fn)(void * arg);
- void * arg;
-};
-
-// 退出处理函数
-struct exit_handler exit_handlers[MR_RUNTIME_MAX_NR_EXIT_HANDLER];
-unsigned int nr_exit_handlers;
-
-// 当前运行线程信息
-pthread_mutex_t thread_ids_lock = PTHREAD_MUTEX_INITIALIZER;
-pthread_t thread_ids[MR_SID_MAX];
-unsigned int nr_thread_ids;
-
-// 信号屏蔽信息
-sigset_t __autoexit_sigmask;
-
-
-/* 处理运行时异常退出的情况。该模块保证应用触发异常,收到退出信号时,
- * 调用退出处理函数,释放资源,保证内存的一致性。*/
-
-#if 0
-static void __autoexit_raise(int status __rte_unused, void * arg __rte_unused)
-{
- void * rtvalue;
-
- pthread_mutex_lock(&thread_ids_lock);
-
- // 通知其他线程退出
- for (int i = 0; i < nr_thread_ids; i++)
- {
- if (pthread_kill(thread_ids[i], 0) < 0) continue;
- pthread_cancel(thread_ids[i]);
- }
-
-
- // 等待其他线程退出
- for (int i = 0; i < nr_thread_ids; i++)
- {
- if (pthread_kill(thread_ids[i], 0) < 0) continue;
- pthread_join(thread_ids[i], &rtvalue);
- }
-
- pthread_mutex_unlock(&thread_ids_lock);
-
- // 运行注册的退出处理函数
- for (int i = 0; i < nr_exit_handlers; i++)
- exit_handlers[i].fn(arg);
-
- // 应用信息注销
- mr_app_manager_appinfo_unregister();
- return;
-}
-
-#endif
-
-#if 0
-static void __autoexit_thread_setup()
-{
- // 记录线程ID
- pthread_mutex_lock(&thread_ids_lock);
- pthread_t pid = pthread_self();
- thread_ids[nr_thread_ids++] = pid;
- pthread_mutex_unlock(&thread_ids_lock);
-
- // 设置线程信号屏蔽,不处理SIGINT、SIGSEGV等信号
- sigset_t oldset;
- pthread_sigmask(SIG_BLOCK, &__autoexit_sigmask, &oldset);
-}
-
-// 信号处理线程
-void * __autoexit_thread(void * arg)
-{
- pthread_t self_pid = pthread_self();
- pthread_detach(self_pid);
-
- int sfd;
- ssize_t s;
- struct signalfd_siginfo fdsi;
-
- sfd = signalfd(-1, &__autoexit_sigmask, 0);
- assert(sfd != 0);
-
- while(1)
- {
- s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
- if(s != sizeof(struct signalfd_siginfo))
- {
- continue;
- }
-
- switch(fdsi.ssi_signo)
- {
- case SIGINT:
- case SIGSEGV:
- case SIGTERM:
- default:
- exit(EXIT_SUCCESS);
- }
- }
-}
-
- static void __autoexit_signal_handler(int signo)
-{
- switch (signo)
- {
- case SIGINT:
- case SIGSEGV:
- case SIGTERM:
- default:
- __autoexit_raise(1, NULL);
- _Exit(EXIT_SUCCESS);
- }
-}
-
-#endif
-
-#if 0
-static void __autoexit_setup()
-{
- sigemptyset(&__autoexit_sigmask);
- sigaddset(&__autoexit_sigmask, SIGINT);
- sigaddset(&__autoexit_sigmask, SIGTERM);
- sigprocmask(SIG_BLOCK, &__autoexit_sigmask, NULL);
-
-#if MR_RUNTIME_SIGHANDLE_BY_SIGFD
- pthread_t pid;
- pthread_create(&pid, NULL, __autoexit_thread, NULL);
-#else
- struct sigaction act, oact;
- act.sa_handler = __autoexit_signal_handler;
- act.sa_mask = __autoexit_sigmask;
- act.sa_flags = 0;
-
- int ret = sigaction(SIGINT, &act, &oact);
- assert(ret >= 0);
- ret = sigaction(SIGTERM, &act, &oact);
- assert(ret >= 0);
-#endif
-
- autoexit = 1;
-}
-
-#endif
-
-int mr_app_register(const char * appsym, cpu_mask_t cpumask,
- unsigned int autoexit __rte_unused)
-{
- //if (autoexit) __autoexit_setup();
- mr_runtime_slave_init();
- mr_app_manager_appinfo_register(appsym, cpumask);
- //on_exit(__autoexit_raise, NULL);
- return 0;
-}
-
-int mr_thread_register()
-{
- //if (autoexit) __autoexit_thread_setup();
- mr_app_manager_thread_register();
- return 0;
-}
-
-void mr_thread_on_exit_register(void(*exit_fn)(void * arg), void * arg)
-{
- return;
-}
-
-void mr_thread_hook()
-{
- if(autoexit) pthread_testcancel();
-}
-
-void mr_on_exit_register(void(*exit_fn)(void * arg), void * arg)
-{
- exit_handlers[nr_exit_handlers].fn = exit_fn;
- exit_handlers[nr_exit_handlers].arg = arg;
- nr_exit_handlers++;
- return;
-} \ No newline at end of file
diff --git a/tools/systemd/mrenv-script b/tools/systemd/mrenv-script
index fafb0a4..75020c5 100644
--- a/tools/systemd/mrenv-script
+++ b/tools/systemd/mrenv-script
@@ -186,11 +186,13 @@ function huge_alloc()
if [ ! $HUGEPAGE_NUM_1G -eq 0 ]; then
huge_release_1G
huge_alloc_1G
+ huge_mount_1G
fi
if [ ! $HUGEPAGE_NUM_2M -eq 0 ]; then
huge_release_2M
huge_alloc_2M
+ huge_mount_2M
fi
if [ $HUGEPAGE_NUM_1G -eq 0 ]; then