diff options
Diffstat (limited to 'runtime/src/event.c')
| -rw-r--r-- | runtime/src/event.c | 34 |
1 files changed, 34 insertions, 0 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); |
