Bug fix for idle event handling 15/320415/1 accepted/tizen/unified/20241118.012227
authorJeongmo Yang <jm80.yang@samsung.com>
Fri, 15 Nov 2024 03:28:23 +0000 (12:28 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 15 Nov 2024 03:28:23 +0000 (12:28 +0900)
- The idle event could be remained although handle is destroyed.
  To fix the issue, add new flag to check whether idle callback is deactivated.

[Version] 1.2.2
[Issue Type] Bug fix

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

index bc082ea303b6a7ce80304feb34bbc544166829ff..169b1aafab428500819b6b92974c468e105d1b08 100644 (file)
@@ -181,13 +181,14 @@ typedef struct _camera_cb_info_s {
 
        /* idle event */
        GList *idle_event_list;
+       gboolean is_in_idle_cb;
+       gboolean is_idle_cb_deactivated;
 
        /* user callback */
        gpointer user_cb[MUSE_CAMERA_EVENT_TYPE_NUM];
        gpointer user_data[MUSE_CAMERA_EVENT_TYPE_NUM];
        GMutex user_cb_lock[MUSE_CAMERA_EVENT_TYPE_NUM];
        gboolean invoke_preview_cb;
-       gboolean is_in_idle_cb;
 
        /* tbm */
        tbm_bufmgr bufmgr;
index 40e8899feb425773ec88727eb13179c2ca5a8b58..f78e3e008c2be934b465996666bc40a81d757c3d 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    1.2.1
+Version:    1.2.2
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 07d4d5fec60ebebc161c18c0205202d2cb0d3346..a01f82129c97b9d2f1f6140f6b6535a81e2aef94 100644 (file)
@@ -1866,29 +1866,32 @@ static gpointer __camera_msg_handler_func(gpointer data)
                                __camera_client_user_callback(cb_info, cam_msg->recv_msg, cam_msg->event, cam_msg->tfd);
                                break;
                        case MUSE_CAMERA_EVENT_CLASS_THREAD_MAIN:
-                               cam_idle_event = g_new0(camera_idle_event_s, 1);
-                               if (cam_idle_event == NULL) {
-                                       CAM_LOG_ERROR("t:%d cam_idle_event alloc failed", type);
-                                       break;
-                               }
+                               g_mutex_lock(&g_cam_idle_event_lock);
 
-                               cam_idle_event->event = cam_msg->event;
-                               cam_idle_event->cb_info = cb_info;
+                               if (cb_info->is_idle_cb_deactivated) {
+                                       CAM_LOG_WARNING("cb_info[%p] idle callback deactivated, skip event[%d]",
+                                               cb_info, cam_msg->event);
+                               } else {
+                                       cam_idle_event = g_new0(camera_idle_event_s, 1);
 
-                               strncpy(cam_idle_event->recv_msg, cam_msg->recv_msg, sizeof(cam_idle_event->recv_msg));
-                               memcpy(cam_idle_event->tfd, cam_msg->tfd, sizeof(cam_idle_event->tfd));
+                                       cam_idle_event->event = cam_msg->event;
+                                       cam_idle_event->cb_info = cb_info;
 
-                               CAM_LOG_DEBUG("t[%d] add camera event[%d, %p] to IDLE",
-                                       type, cam_msg->event, cam_idle_event);
+                                       strncpy(cam_idle_event->recv_msg, cam_msg->recv_msg, sizeof(cam_idle_event->recv_msg));
+                                       memcpy(cam_idle_event->tfd, cam_msg->tfd, sizeof(cam_idle_event->tfd));
 
-                               g_mutex_lock(&g_cam_idle_event_lock);
-                               cb_info->idle_event_list = g_list_append(cb_info->idle_event_list, (gpointer)cam_idle_event);
-                               g_mutex_unlock(&g_cam_idle_event_lock);
+                                       CAM_LOG_DEBUG("cb_info[%p] add idle event[%d][%p]",
+                                               cb_info, cam_idle_event->event, cam_idle_event);
 
-                               g_idle_add_full(G_PRIORITY_DEFAULT,
-                                       (GSourceFunc)__camera_idle_event_callback,
-                                       (gpointer)cam_idle_event,
-                                       NULL);
+                                       cb_info->idle_event_list = g_list_append(cb_info->idle_event_list, (gpointer)cam_idle_event);
+
+                                       g_idle_add_full(G_PRIORITY_DEFAULT,
+                                               (GSourceFunc)__camera_idle_event_callback,
+                                               (gpointer)cam_idle_event,
+                                               NULL);
+                               }
+
+                               g_mutex_unlock(&g_cam_idle_event_lock);
                                break;
                        default:
                                CAM_LOG_ERROR("t:%d not handled event class %d", type, cam_msg->event_class);
@@ -1933,6 +1936,8 @@ static void __camera_deactivate_idle_event_all(camera_cb_info_s *cb_info)
                return;
        }
 
+       cb_info->is_idle_cb_deactivated = TRUE;
+
        if (cb_info->idle_event_list == NULL) {
                CAM_LOG_INFO("No remained idle event");
                return;