summaryrefslogtreecommitdiff
path: root/runtime/src
diff options
context:
space:
mode:
author陆秋文 <[email protected]>2016-12-15 12:35:11 +0800
committer陆秋文 <[email protected]>2016-12-15 12:35:11 +0800
commitecbfe0737fecf2929cb77d368bb3ecefade93e49 (patch)
tree44796254a61be71c27e94426c7e9d71121b4e913 /runtime/src
parent7c6adef9371b899ff9428bd8c74adcfc43a2063a (diff)
parent092ea4de6b07a6da5e9b349b099d6f209c3a2c67 (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.c34
-rw-r--r--runtime/src/runtime.c4
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);