Guarantee the race condition of destroy dispatcher() 04/258204/3 accepted/tizen/unified/20210601.135353 submit/tizen/20210520.070515 submit/tizen/20210528.061611
authorYoungHun Kim <yh8004.kim@samsung.com>
Wed, 12 May 2021 07:04:00 +0000 (16:04 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Thu, 20 May 2021 06:33:32 +0000 (15:33 +0900)
 - If same handle's destroy_dispatcher is called at the same time,
   it can be occurred memory contention.
 - Add log for debugging

Change-Id: Ic1d733853083f5c7960e1156bb233f4c6be8411f

src/lib/mm_resource_manager_priv.c

index 19675f5..64b52a3 100644 (file)
@@ -1119,6 +1119,8 @@ static gpointer __dispatcher_thread(gpointer user_data)
 {
        GMainLoop *ml = (GMainLoop *) user_data;
 
+       MM_RM_INFO("main loop %p", ml);
+
        if (ml) {
                g_main_loop_run(ml);
                MM_RM_INFO("main loop %p quit", ml);
@@ -1129,15 +1131,20 @@ static gpointer __dispatcher_thread(gpointer user_data)
 
 static void __destroy_dispatcher(mm_resource_manager_s *handle)
 {
+       MM_RM_WARNING("handle %p", handle);
+
+       __mm_resource_handles_lock();
+
        if (__dbus_deinit(handle) != MM_RESOURCE_MANAGER_ERROR_NONE)
                MM_RM_ERROR("Error while dbus deinitializing");
 
-       MM_RM_INFO("dispatcher loop %p", handle->dispatcher_loop);
+       MM_RM_INFO("dispatcher main loop %p", handle->dispatcher_loop);
        if (handle->dispatcher_loop) {
                if (g_main_loop_is_running(handle->dispatcher_loop)) {
                        MM_RM_INFO("mainloop %p is running", handle->dispatcher_loop);
                        g_main_loop_quit(handle->dispatcher_loop);
                }
+
                g_main_loop_unref(handle->dispatcher_loop);
                handle->dispatcher_loop = NULL;
        }
@@ -1154,4 +1161,6 @@ static void __destroy_dispatcher(mm_resource_manager_s *handle)
                g_main_context_unref(handle->dispatcher_context);
                handle->dispatcher_context = NULL;
        }
+
+       __mm_resource_handles_unlock();
 }