Separate mutex 70/274370/1
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 27 Apr 2022 06:41:45 +0000 (15:41 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 27 Apr 2022 06:41:45 +0000 (15:41 +0900)
Currently, if the thread calls __add_client_channel() and the main thread calls
aul_worker_destroy(), the process is a deadlock state.
To avoid the deadlock issue, the mutex is separated. The init_mutex is
added for aul_launch_init() and aul_launch_fini().

Change-Id: I2edd8ab3db73eeade11f8aab3bbd1dc468f4b276
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/aul_launch.c

index 7a660fc..abb022d 100644 (file)
@@ -85,6 +85,7 @@ typedef struct launch_context_s {
        subapp_handler subapp;
        data_control_provider_handler dcp;
        GList* clients;
+       GRecMutex init_mutex;
        GRecMutex mutex;
        GMainContext *tizen_context;
        bool touch_argv_handler;
@@ -94,15 +95,15 @@ static launch_context __context;
 
 AUL_CTOR static void __aul_constructor(void)
 {
-       g_rec_mutex_init(&__context.mutex);
+       g_rec_mutex_init(&__context.init_mutex);
 }
 
 AUL_DTOR static void __aul_destructor(void)
 {
-       if (g_rec_mutex_trylock(&__context.mutex))
-               g_rec_mutex_unlock(&__context.mutex);
+       if (g_rec_mutex_trylock(&__context.init_mutex))
+               g_rec_mutex_unlock(&__context.init_mutex);
 
-       g_rec_mutex_clear(&__context.mutex);
+       g_rec_mutex_clear(&__context.init_mutex);
 }
 
 static void __destroy_client_channel(gpointer data)
@@ -630,9 +631,9 @@ static bool __connected_event_cb(int fd, int condition, void *user_data)
 
 static void __finalize_context(void)
 {
-       g_rec_mutex_lock(&__context.mutex);
+       g_rec_mutex_lock(&__context.init_mutex);
        if (!__context.initialized) {
-               g_rec_mutex_unlock(&__context.mutex);
+               g_rec_mutex_unlock(&__context.init_mutex);
                return;
        }
 
@@ -653,8 +654,13 @@ static void __finalize_context(void)
                __context.clients = NULL;
        }
 
+       if (g_rec_mutex_trylock(&__context.mutex))
+               g_rec_mutex_unlock(&__context.mutex);
+
+       g_rec_mutex_clear(&__context.mutex);
+
        __context.initialized = false;
-       g_rec_mutex_unlock(&__context.mutex);
+       g_rec_mutex_unlock(&__context.init_mutex);
 }
 
 static GMainContext *__get_tizen_glib_context(void)
@@ -692,6 +698,8 @@ static int __initialize_context(void)
                return fd;
        }
 
+       g_rec_mutex_init(&__context.mutex);
+
        context = __get_tizen_glib_context();
        if (context)
                __context.tizen_context = g_main_context_ref(context);
@@ -720,14 +728,14 @@ API int aul_launch_init(aul_handler_fn callback, void *user_data)
 {
        int ret;
 
-       g_rec_mutex_lock(&__context.mutex);
+       g_rec_mutex_lock(&__context.init_mutex);
        if (callback) {
                __context.aul.callback = callback;
                __context.aul.user_data = user_data;
        }
 
        ret = __initialize_context();
-       g_rec_mutex_unlock(&__context.mutex);
+       g_rec_mutex_unlock(&__context.init_mutex);
 
        return ret;
 }