From 9e0d24d1e51eefb5ea3e8c36cc27d26ab2767ba2 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 15 Nov 2024 12:28:23 +0900 Subject: [PATCH] Bug fix for idle event handling - 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 --- include/camera_private.h | 3 ++- packaging/capi-media-camera.spec | 2 +- src/camera.c | 41 ++++++++++++++++++-------------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/include/camera_private.h b/include/camera_private.h index bc082ea..169b1aa 100644 --- a/include/camera_private.h +++ b/include/camera_private.h @@ -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; diff --git a/packaging/capi-media-camera.spec b/packaging/capi-media-camera.spec index 40e8899..f78e3e0 100644 --- a/packaging/capi-media-camera.spec +++ b/packaging/capi-media-camera.spec @@ -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 diff --git a/src/camera.c b/src/camera.c index 07d4d5f..a01f821 100644 --- a/src/camera.c +++ b/src/camera.c @@ -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; -- 2.34.1