Free idle event in idle callback only. 57/311357/2 accepted/tizen/unified/20240701.191826 accepted/tizen/unified/dev/20240702.054017 accepted/tizen/unified/x/20240702.031211
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 14 May 2024 00:18:41 +0000 (09:18 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 28 Jun 2024 11:07:50 +0000 (20:07 +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] 1.1.1
[Issue Type] Improvement

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

index c345d7ba8c666cb774afc6c89a7fa8a19dd14927..ea82674cedc163b1bc3e73de2f085d43d2b4bc62 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    1.1.0
+Version:    1.1.1
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 3e02fa04303cb51f1e9db7802c0fa90f795d2ce8..e1cf445b05b502cb26cce1dfdaf930f773df1d21 100644 (file)
@@ -1750,7 +1750,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;
        }
@@ -1767,7 +1767,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;
 }
@@ -1943,18 +1942,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;