Bug fix for idle event handling 55/320355/4 accepted/tizen_unified accepted/tizen_unified_x accepted/tizen_unified_x_asan tizen accepted/tizen/unified/20241118.012236 accepted/tizen/unified/x/20241218.032748 accepted/tizen/unified/x/asan/20241224.004514
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 14 Nov 2024 01:57:17 +0000 (10:57 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 15 Nov 2024 02:10:16 +0000 (11:10 +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.0.2
[Issue Type] Bug fix

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

index 365c19e9917606ff28eae091b023ef2ab4c26276..9a3bc9a08c71393bf5b08bc320a29c46670c800e 100644 (file)
@@ -148,6 +148,7 @@ typedef struct _recorder_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_RECORDER_EVENT_TYPE_NUM];
index b5f743c90aaad0e25e2945660f91bb0e8a1513eb..b22313b8679e4f2dd561c17373b5403afa071689 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-recorder
 Summary:    A Recorder API
-Version:    1.0.1
+Version:    1.0.2
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 967bdb895cf6800e052e132a9229723bdfeb6766..c5fe8853e203f2dba1fb1a6d82a0ec822182361a 100644 (file)
@@ -626,8 +626,10 @@ static void _recorder_deactivate_idle_event_all(recorder_cb_info_s *cb_info)
                return;
        }
 
+       cb_info->is_idle_cb_deactivated = TRUE;
+
        if (cb_info->idle_event_list == NULL) {
-               REC_LOG_INFO("No remained idle event");
+               REC_LOG_WARNING("cb_info[%p] No remained idle event", cb_info);
                return;
        }
 
@@ -642,8 +644,8 @@ static void _recorder_deactivate_idle_event_all(recorder_cb_info_s *cb_info)
                        continue;
                }
 
-               REC_LOG_WARNING("set NULL cb_info for event[%d] %p, it will be freed on idle callback",
-                       rec_idle_event->event, rec_idle_event);
+               REC_LOG_WARNING("set NULL cb_info[%p] for event[%d][%p] which will be freed in idle cb",
+                       cb_info, rec_idle_event->event, rec_idle_event);
 
                rec_idle_event->cb_info = NULL;
 
@@ -1013,27 +1015,31 @@ static void *_recorder_msg_handler_func(gpointer data)
                                _recorder_client_user_callback(cb_info, rec_msg->recv_msg, rec_msg->event, rec_msg->tfd);
                                break;
                        case MUSE_RECORDER_EVENT_CLASS_THREAD_MAIN:
-                               rec_idle_event = g_new0(recorder_idle_event_s, 1);
-                               if (rec_idle_event == NULL) {
-                                       REC_LOG_ERROR("event alloc failed");
-                                       break;
-                               }
+                               g_mutex_lock(&g_rec_idle_event_lock);
 
-                               rec_idle_event->event = rec_msg->event;
-                               rec_idle_event->cb_info = cb_info;
+                               if (cb_info->is_idle_cb_deactivated) {
+                                       REC_LOG_WARNING("cb_info[%p] idle callback deactivated, skip event[%d]",
+                                               cb_info, rec_msg->event);
+                               } else {
+                                       rec_idle_event = g_new0(recorder_idle_event_s, 1);
 
-                               strncpy(rec_idle_event->recv_msg, rec_msg->recv_msg, sizeof(rec_idle_event->recv_msg));
+                                       rec_idle_event->event = rec_msg->event;
+                                       rec_idle_event->cb_info = cb_info;
 
-                               REC_LOG_DEBUG("add recorder event[%d][%p] to IDLE", rec_msg->event, rec_idle_event);
+                                       strncpy(rec_idle_event->recv_msg, rec_msg->recv_msg, sizeof(rec_idle_event->recv_msg));
 
-                               g_mutex_lock(&g_rec_idle_event_lock);
-                               cb_info->idle_event_list = g_list_append(cb_info->idle_event_list, (gpointer)rec_idle_event);
-                               g_mutex_unlock(&g_rec_idle_event_lock);
+                                       REC_LOG_DEBUG("cb_info[%p] add idle event[%d][%p]",
+                                               cb_info, rec_idle_event->event, rec_idle_event);
 
-                               g_idle_add_full(G_PRIORITY_DEFAULT,
-                                       (GSourceFunc)_recorder_idle_event_callback,
-                                       (gpointer)rec_idle_event,
-                                       NULL);
+                                       cb_info->idle_event_list = g_list_append(cb_info->idle_event_list, (gpointer)rec_idle_event);
+
+                                       g_idle_add_full(G_PRIORITY_DEFAULT,
+                                               (GSourceFunc)_recorder_idle_event_callback,
+                                               (gpointer)rec_idle_event,
+                                               NULL);
+                               }
+
+                               g_mutex_unlock(&g_rec_idle_event_lock);
                                break;
                        default:
                                REC_LOG_ERROR("unknown event class[%d]", rec_msg->event_class);
@@ -1282,6 +1288,8 @@ static recorder_cb_info_s *_recorder_client_callback_new(gint sockfd)
                goto ErrorExit;
        }
 
+       REC_LOG_WARNING("new cb_info[%p]", cb_info);
+
        cb_info->is_server_connected = TRUE;
 
        return cb_info;
@@ -1542,6 +1550,8 @@ static void _recorder_client_callback_destroy(recorder_cb_info_s *cb_info)
                cb_info->get_filename = NULL;
        }
 
+       REC_LOG_WARNING("release cb_info[%p]", cb_info);
+
        g_free(cb_info);
        cb_info = NULL;