Free idle event in idle callback only. 96/313496/1
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 14 May 2024 00:18:41 +0000 (09:18 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 27 Jun 2024 00:51:00 +0000 (09:51 +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.119
[Issue Type] Improvement

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

index 2c01ab29d928867261f3d9a6293b8116fb774e75..147ca363438f43fb6fd43176ec9b852ef908b300 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    0.4.118
+Version:    0.4.119
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 6b95317f7b36c5d9d3b8557d41bdc80fb9796e83..bd33b1ea339b5eb4ba9d8fe7affeeadc95ac9786 100644 (file)
@@ -1765,7 +1765,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;
        }
@@ -1782,7 +1782,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;
 }
@@ -1960,18 +1959,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;