From 0d6f7636e5a68e0431a84495a795c92562e40fd6 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 23 Nov 2016 19:53:40 +0900 Subject: [PATCH] Fix signal handling problem when app terminate Change-Id: Iae1fc20c5f11489804d1a1c3185d6ce8d8368d3f Signed-off-by: Wonnam Jang --- server/vcd_dbus.c | 11 ++++++++++- server/vcd_dbus.h | 1 + server/vcd_main.c | 2 ++ server/vcd_server.c | 20 ++++++++++++++++++-- server/vcd_server.h | 2 ++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index cf3a011..5bcd10f 100644 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -79,13 +79,22 @@ int vcd_dbus_reconnect() static int __dbus_check() { - if (NULL == g_conn_sender) { + if (NULL == g_conn_sender || NULL == g_conn_listener) { SLOG(LOG_ERROR, TAG_VCD, "[ERROR] NULL connection"); return vcd_dbus_reconnect(); } return 0; } +int vcd_check_dbus_connection() +{ + if (NULL == g_conn_sender || NULL == g_conn_listener) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] NULL connection sender(%p), listener(%p)", g_conn_sender, g_conn_listener); + return -1; + } + return 0; +} + int vcdc_send_hello(int pid, vcd_client_type_e type) { if (0 != __dbus_check()) { diff --git a/server/vcd_dbus.h b/server/vcd_dbus.h index a1abc46..812e643 100644 --- a/server/vcd_dbus.h +++ b/server/vcd_dbus.h @@ -34,6 +34,7 @@ int vcd_dbus_open_connection(); int vcd_dbus_close_connection(); +int vcd_check_dbus_connection(); int vcdc_send_hello(int pid, vcd_client_type_e type); diff --git a/server/vcd_main.c b/server/vcd_main.c index 2996ba0..903ff3f 100644 --- a/server/vcd_main.c +++ b/server/vcd_main.c @@ -67,6 +67,8 @@ int main(int argc, char** argv) vcd_finalize(); + vcd_unregister_signal(); + vcd_dbus_close_connection(); ecore_shutdown(); diff --git a/server/vcd_server.c b/server/vcd_server.c index 2baf934..24fda25 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -919,9 +919,12 @@ static void __sig_handler(int signo) { /* restore signal handler */ signal(signo, SIG_DFL); + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR]"); - /* Send error signal for notifying that daemon is reset*/ - vcdc_send_error_signal(VCD_ERROR_SERVICE_RESET, "Daemon reset"); + if (0 == vcd_check_dbus_connection()) { + /* Send error signal for notifying that daemon is reset*/ + vcdc_send_error_signal(VCD_ERROR_SERVICE_RESET, "Daemon reset"); + } /* invoke signal again */ raise(signo); @@ -934,6 +937,19 @@ static void __register_sig_handler() signal(SIGTERM, __sig_handler); signal(SIGINT, __sig_handler); signal(SIGQUIT, __sig_handler); + signal(SIGILL, __sig_handler); + signal(SIGBUS, __sig_handler); +} + +void vcd_unregister_signal() +{ + signal(SIGSEGV, SIG_IGN); + signal(SIGABRT, SIG_IGN); + signal(SIGTERM, SIG_IGN); + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + signal(SIGILL, SIG_IGN); + signal(SIGBUS, SIG_IGN); } int vcd_initialize() diff --git a/server/vcd_server.h b/server/vcd_server.h index 5166ccb..72a51db 100644 --- a/server/vcd_server.h +++ b/server/vcd_server.h @@ -32,6 +32,8 @@ int vcd_initialize(); void vcd_finalize(); +void vcd_unregister_signal(); + Eina_Bool vcd_cleanup_client_all(void *data); int vcd_server_get_service_state(); -- 2.7.4