core: Change to register signal handler with glib 65/293065/1 tizen_6.5
authorTaeminYeom <taemin.yeom@samsung.com>
Fri, 19 May 2023 02:37:18 +0000 (11:37 +0900)
committerTaeminYeom <taemin.yeom@samsung.com>
Fri, 19 May 2023 04:38:07 +0000 (13:38 +0900)
Using standard signal handler can make deadlock in terminating progress.
When standard signal handler is called dispatching g_main_context,
glib attempts to lock g_main_context again.
To prevent this situation, it is needed to use glib signal handler function.

Change-Id: I2cf13e02a7f7a55a3906eb3771ce1a7e35180423
Signed-off-by: TaeminYeom <taemin.yeom@samsung.com>
src/core/main.c

index c3efc39..c303058 100644 (file)
 
 static GMainLoop *mainloop = NULL;
 
-static void sig_quit(int signo)
+static gboolean handle_sigterm(gpointer data)
 {
-       _D("Received SIGTERM signal(%d)", signo);
+       long signo = (long) data;
+       _D("Received SIGTERM signal(%ld).", signo);
+
+       return G_SOURCE_REMOVE;
 }
 
-static void sig_usr1(int signo)
+static gboolean handle_sigusr1(gpointer data)
 {
-       _D("Received SIGUSR1 signal(%d), feedbackd'll be finished.", signo);
+       long signo = (long) data;
 
-       if (mainloop) {
-               if (g_main_loop_is_running(mainloop))
-                       g_main_loop_quit(mainloop);
-       }
+       _D("Received SIGUSR1 signal(%ld), feedbackd'll be finished.", signo);
+
+       if (mainloop && g_main_loop_is_running(mainloop))
+               g_main_loop_quit(mainloop);
+
+       return G_SOURCE_REMOVE;
 }
 
 static void dbus_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data)
@@ -88,8 +93,8 @@ int main(int argc, char **argv)
                gdbus_check_name_owner(NULL, VIBRATOR_BUS_NAME);
        }
 
-       signal(SIGTERM, sig_quit);
-       signal(SIGUSR1, sig_usr1);
+       g_unix_signal_add(SIGTERM, handle_sigterm, (gpointer) SIGTERM);
+       g_unix_signal_add(SIGUSR1, handle_sigusr1, (gpointer) SIGUSR1);
 
        /* g_main_loop */
        g_main_loop_run(mainloop);