diff options
| author | 陆秋文 <[email protected]> | 2016-12-15 12:35:11 +0800 |
|---|---|---|
| committer | 陆秋文 <[email protected]> | 2016-12-15 12:35:11 +0800 |
| commit | ecbfe0737fecf2929cb77d368bb3ecefade93e49 (patch) | |
| tree | 44796254a61be71c27e94426c7e9d71121b4e913 /runtime/src | |
| parent | 7c6adef9371b899ff9428bd8c74adcfc43a2063a (diff) | |
| parent | 092ea4de6b07a6da5e9b349b099d6f209c3a2c67 (diff) | |
Merge branch 'dev-4.X.X' into 'rel-4.X.X'
v4.0.11-20161215
REL: v4.0.11
增加从进程监测主进程崩溃的功能。主进程崩溃,会立即导致所有的从进程退出。增加死锁监测功能,主进程线程死锁后立即退出。
See merge request !15
Diffstat (limited to 'runtime/src')
| -rw-r--r-- | runtime/src/event.c | 34 | ||||
| -rw-r--r-- | runtime/src/runtime.c | 4 |
2 files changed, 37 insertions, 1 deletions
diff --git a/runtime/src/event.c b/runtime/src/event.c index 3e05a65..c13c7b0 100644 --- a/runtime/src/event.c +++ b/runtime/src/event.c @@ -93,6 +93,32 @@ int app_crash_cb_register(struct app_ev_manager * object, app_event_cb_t cb, 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); + } + + assert(0); + MR_LOG(ERR, BASE, "Crash monitor thread is exited. This is an error. \n"); + return (void *)NULL; +} + /* ע������¼�Դ */ int app_crash_raiser_register(struct app_ev_manager * object, const char * appsym) { @@ -113,6 +139,14 @@ int app_crash_raiser_register(struct app_ev_manager * object, const char * appsy 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", 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); diff --git a/runtime/src/runtime.c b/runtime/src/runtime.c index 9472438..ac40178 100644 --- a/runtime/src/runtime.c +++ b/runtime/src/runtime.c @@ -67,7 +67,9 @@ void mr_runtime_slave_init() 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; + 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); |
