Free idle event in idle callback only. 77/311077/1 accepted/tizen/7.0/unified/20240514.162724
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 14 May 2024 00:18:41 +0000 (09:18 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 14 May 2024 00:18:41 +0000 (09:18 +0900)
- It seems that idle callback can be remained although g_idle_remove_by_data() returns TRUE.
  It will cause the crash when idle callback is called after camera handle is destroyed.

[Version] 0.4.108
[Issue Type] Improvement

Change-Id: I3d0c51ffbd928e95cf72603b4a52497ed327791f
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/capi-media-camera.spec
src/camera.c

index 214ec9fb798dde272b6fe46c19157e65013e352c..dac540078952f969eabaa4d12bd92766fbcc7f4e 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    0.4.107
+Version:    0.4.108
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 6aa480fc15b7a01358c05f2b2eb755e0a9ee5237..520de043741c5fd5c2869c6ec219b9682b597fd4 100644 (file)
@@ -1772,7 +1772,7 @@ static gboolean __camera_idle_event_callback(gpointer data)
 
        cb_info = cam_idle_event->cb_info;
        if (cb_info == NULL) {
-               CAM_LOG_WARNING("camera cb_info is NULL. event %p %d", cam_idle_event, cam_idle_event->event);
+               CAM_LOG_WARNING("NULL cb_info for event[%d] %p", cam_idle_event->event, cam_idle_event);
                g_mutex_unlock(&g_cam_idle_event_lock);
                goto IDLE_EVENT_CALLBACK_DONE;
        }
@@ -1789,7 +1789,6 @@ static gboolean __camera_idle_event_callback(gpointer data)
 IDLE_EVENT_CALLBACK_DONE:
        /* release event */
        g_free(cam_idle_event);
-       cam_idle_event = NULL;
 
        return FALSE;
 }
@@ -1959,18 +1958,8 @@ static void __camera_deactivate_idle_event_all(camera_cb_info_s *cb_info)
                        continue;
                }
 
-               if (g_idle_remove_by_data(cam_idle_event)) {
-                       CAM_LOG_WARNING("remove idle event %p done", cam_idle_event);
-
-                       cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)cam_idle_event);
-
-                       g_free(cam_idle_event);
-
-                       continue;
-               }
-
-               CAM_LOG_WARNING("set NULL cb_info for event %p %d, it will be freed on idle callback",
-                       cam_idle_event, cam_idle_event->event);
+               CAM_LOG_WARNING("set NULL cb_info for event[%d] %p, it will be freed on idle callback",
+                       cam_idle_event->event, cam_idle_event);
 
                cam_idle_event->cb_info = NULL;