Fix signal handling problem when app terminate 05/99605/3
authorWonnam Jang <wn.jang@samsung.com>
Wed, 23 Nov 2016 10:53:40 +0000 (19:53 +0900)
committerWonnam Jang <wn.jang@samsung.com>
Wed, 23 Nov 2016 11:27:11 +0000 (20:27 +0900)
Change-Id: Iae1fc20c5f11489804d1a1c3185d6ce8d8368d3f
Signed-off-by: Wonnam Jang <wn.jang@samsung.com>
server/vcd_dbus.c
server/vcd_dbus.h
server/vcd_main.c
server/vcd_server.c
server/vcd_server.h

index cf3a011..5bcd10f 100644 (file)
@@ -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()) {
index a1abc46..812e643 100644 (file)
@@ -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);
 
index 2996ba0..903ff3f 100644 (file)
@@ -67,6 +67,8 @@ int main(int argc, char** argv)
 
        vcd_finalize();
 
+       vcd_unregister_signal();
+
        vcd_dbus_close_connection();
 
        ecore_shutdown();
index 2baf934..24fda25 100644 (file)
@@ -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()
index 5166ccb..72a51db 100644 (file)
@@ -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();