summaryrefslogtreecommitdiff
path: root/runtime/src/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/src/event.c')
-rw-r--r--runtime/src/event.c34
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);