diff options
| author | Qiuwen Lu <[email protected]> | 2017-04-12 14:42:58 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-04-12 14:42:58 +0800 |
| commit | 00f24a934fe1dd6207c1f836a9ea9e6f2ed44246 (patch) | |
| tree | 8b1fc0d23aa3088ca22698bdba402fa0fa5e918a | |
| parent | 7f53b1e7e7e811fd8fbe1c866202839fe2b41b07 (diff) | |
修正环境启动脚本的Bug,增加了RPM包安装、卸载的环境配置脚本。v4.1.1-20170412
| -rw-r--r-- | .editorconfig | 7 | ||||
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | cmake/Package.cmake | 3 | ||||
| -rw-r--r-- | cmake/PostInstall.in | 2 | ||||
| -rw-r--r-- | cmake/PostUninstall.in | 2 | ||||
| -rw-r--r-- | cmake/PreUninstall.in | 1 | ||||
| -rw-r--r-- | conf/mrglobal.conf | 47 | ||||
| -rw-r--r-- | runtime/CMakeLists.txt | 12 | ||||
| -rw-r--r-- | runtime/include/mr_runtime.h | 71 | ||||
| -rw-r--r-- | runtime/include/runtime.h | 69 | ||||
| -rw-r--r-- | runtime/src/app.c | 655 | ||||
| -rw-r--r-- | runtime/src/ctx.c | 131 | ||||
| -rw-r--r-- | runtime/src/event.c | 479 | ||||
| -rw-r--r-- | runtime/src/export.c | 120 | ||||
| -rw-r--r-- | runtime/src/id.c | 117 | ||||
| -rw-r--r-- | runtime/src/runtime.c | 267 | ||||
| -rw-r--r-- | tools/systemd/mrenv-script | 2 |
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, ®_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 |
