Lock and unlock a recursive mutex 10/277610/1
authorHwankyu Jhun <h.jhun@samsung.com>
Mon, 11 Jul 2022 04:43:25 +0000 (13:43 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Mon, 11 Jul 2022 04:46:02 +0000 (13:46 +0900)
To make thread safe, AUL locks and unlocks the mutex when
aul_launch_init() or aul_launch_fini() is called.

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

index c686dd54a4f46e8e935c6b2c71cb2a36911d0883..2a95ed438afd36339b00487d31cdc5581ad1caf1 100644 (file)
@@ -40,6 +40,8 @@
 #include "aul_watchdog.h"
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+#define AUL_CTOR __attribute__ ((constructor))
+#define AUL_DTOR __attribute__ ((destructor))
 
 typedef struct client_channel_s {
        int fd;
@@ -80,11 +82,25 @@ typedef struct launch_context_s {
        subapp_handler subapp;
        data_control_provider_handler dcp;
        GList* clients;
+       GRecMutex init_mutex;
        GRecMutex mutex;
 } launch_context;
 
 static launch_context __context;
 
+AUL_CTOR static void __aul_constructor(void)
+{
+       g_rec_mutex_init(&__context.init_mutex);
+}
+
+AUL_DTOR static void __aul_destructor(void)
+{
+       if (g_rec_mutex_trylock(&__context.init_mutex))
+               g_rec_mutex_unlock(&__context.init_mutex);
+
+       g_rec_mutex_clear(&__context.init_mutex);
+}
+
 static void __destroy_client_channel(gpointer data)
 {
        client_channel_t *channel = data;
@@ -561,8 +577,11 @@ static bool __connected_event_cb(int fd, int condition, void *user_data)
 
 static void __finalize_context(void)
 {
-       if (!__context.initialized)
+       g_rec_mutex_init(&__context.init_mutex);
+       if (!__context.initialized) {
+               g_rec_mutex_unlock(&__context.init_mutex);
                return;
+       }
 
        if (__context.worker) {
                aul_worker_destroy(__context.worker);
@@ -579,6 +598,7 @@ static void __finalize_context(void)
        g_rec_mutex_clear(&__context.mutex);
 
        __context.initialized = false;
+       g_rec_mutex_unlock(&__context.init_mutex);
 }
 
 static int __initialize_context(void)
@@ -619,12 +639,18 @@ static int __initialize_context(void)
 
 API int aul_launch_init(aul_handler_fn callback, void *user_data)
 {
+       int ret;
+
+       g_rec_mutex_lock(&__context.init_mutex);
        if (callback) {
                __context.aul.callback = callback;
                __context.aul.user_data = user_data;
        }
 
-       return __initialize_context();
+       ret = __initialize_context();
+       g_rec_mutex_unlock(&__context.init_mutex);
+
+       return ret;
 }
 
 API int aul_launch_fini(void)