From: Jeongmo Yang Date: Thu, 25 Oct 2018 06:28:54 +0000 (+0900) Subject: Update idle event handling to fix crash in idle event callback X-Git-Tag: accepted/tizen/unified/20181107.082043^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F04%2F191904%2F2;p=platform%2Fcore%2Fapi%2Frecorder.git Update idle event handling to fix crash in idle event callback [Version] 0.3.13 [Profile] Common [Issue Type] Bug fix [Dependency module] N/A Change-Id: Ib1d268c42b6948e9d55e837b315a5150c9cb07e1 Signed-off-by: Jeongmo Yang --- diff --git a/include/recorder_private.h b/include/recorder_private.h index de16944..388b5a7 100644 --- a/include/recorder_private.h +++ b/include/recorder_private.h @@ -102,8 +102,6 @@ typedef struct _recorder_cb_info_s { /* idle event */ GList *idle_event_list; - GCond idle_event_cond; - GMutex idle_event_mutex; /* user callback */ gpointer user_cb[MUSE_RECORDER_EVENT_TYPE_NUM]; diff --git a/packaging/capi-media-recorder.spec b/packaging/capi-media-recorder.spec index 44b17f5..4af4a24 100644 --- a/packaging/capi-media-recorder.spec +++ b/packaging/capi-media-recorder.spec @@ -1,6 +1,6 @@ Name: capi-media-recorder Summary: A Recorder API -Version: 0.3.12 +Version: 0.3.13 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/recorder.c b/src/recorder.c index 1b9df7b..5fecf1e 100644 --- a/src/recorder.c +++ b/src/recorder.c @@ -43,6 +43,7 @@ static GList *g_rec_dev_state_changed_cb_list; static int g_rec_dev_state_changed_cb_id; static GDBusConnection *g_rec_dev_state_changed_cb_conn; static guint g_rec_dev_state_changed_cb_subscribe_id; +static GMutex g_rec_idle_event_lock; @@ -420,49 +421,41 @@ static void _recorder_client_user_callback(recorder_cb_info_s *cb_info, char *re } -static bool _recorder_idle_event_callback(void *data) +static gboolean _recorder_idle_event_callback(gpointer data) { recorder_cb_info_s *cb_info = NULL; recorder_idle_event_s *rec_idle_event = (recorder_idle_event_s *)data; if (rec_idle_event == NULL) { LOGE("rec_idle_event is NULL"); - return false; + return FALSE; } /* lock event */ - g_mutex_lock(&rec_idle_event->event_mutex); + g_mutex_lock(&g_rec_idle_event_lock); cb_info = rec_idle_event->cb_info; if (cb_info == NULL) { LOGW("recorder cb_info is NULL. event %p %d", rec_idle_event, rec_idle_event->event); + g_mutex_unlock(&g_rec_idle_event_lock); goto IDLE_EVENT_CALLBACK_DONE; } /* remove event from list */ - g_mutex_lock(&cb_info->idle_event_mutex); - if (cb_info->idle_event_list) cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event); - /*LOGD("remove recorder idle event %p, %p", rec_idle_event, cb_info->idle_event_list);*/ - g_mutex_unlock(&cb_info->idle_event_mutex); + g_mutex_unlock(&g_rec_idle_event_lock); /* user callback */ _recorder_client_user_callback(cb_info, rec_idle_event->recv_msg, rec_idle_event->event); - /* send signal for waiting thread */ - g_cond_signal(&cb_info->idle_event_cond); - IDLE_EVENT_CALLBACK_DONE: - /* unlock and release event */ - g_mutex_unlock(&rec_idle_event->event_mutex); - g_mutex_clear(&rec_idle_event->event_mutex); - + /* release event */ g_free(rec_idle_event); rec_idle_event = NULL; - return false; + return FALSE; } @@ -470,14 +463,13 @@ static void _recorder_deactivate_idle_event_all(recorder_cb_info_s *cb_info) { recorder_idle_event_s *rec_idle_event = NULL; GList *list = NULL; - gint64 end_time = 0; if (cb_info == NULL) { LOGE("cb_info is NULL"); return; } - g_mutex_lock(&cb_info->idle_event_mutex); + g_mutex_lock(&g_rec_idle_event_lock); if (cb_info->idle_event_list == NULL) { LOGD("No event"); @@ -498,43 +490,25 @@ static void _recorder_deactivate_idle_event_all(recorder_cb_info_s *cb_info) cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event); - g_mutex_clear(&rec_idle_event->event_mutex); g_free(rec_idle_event); rec_idle_event = NULL; continue; } - LOGW("remove idle event %p failed", rec_idle_event); - - if (!g_mutex_trylock(&rec_idle_event->event_mutex)) { - LOGW("lock failed, %p event is calling now", rec_idle_event); - - end_time = g_get_monotonic_time() + G_TIME_SPAN_MILLISECOND * 100; - - if (g_cond_wait_until(&cb_info->idle_event_cond, &cb_info->idle_event_mutex, end_time)) - LOGW("signal received"); - else - LOGW("timeout"); - - continue; - } - LOGW("set NULL cb_info for event %p %d, it will be freed on idle callback", rec_idle_event, rec_idle_event->event); rec_idle_event->cb_info = NULL; cb_info->idle_event_list = g_list_remove(cb_info->idle_event_list, (gpointer)rec_idle_event); - - g_mutex_unlock(&rec_idle_event->event_mutex); } g_list_free(cb_info->idle_event_list); cb_info->idle_event_list = NULL; } - g_mutex_unlock(&cb_info->idle_event_mutex); + g_mutex_unlock(&g_rec_idle_event_lock); return; } @@ -884,14 +858,14 @@ static void *_recorder_msg_handler_func(gpointer data) rec_idle_event->event = rec_msg->event; rec_idle_event->cb_info = cb_info; - g_mutex_init(&rec_idle_event->event_mutex); + strncpy(rec_idle_event->recv_msg, rec_msg->recv_msg, sizeof(rec_idle_event->recv_msg) - 1); /*LOGD("add recorder event[%d, %p] to IDLE", rec_msg->event, rec_idle_event);*/ - g_mutex_lock(&cb_info->idle_event_mutex); + 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(&cb_info->idle_event_mutex); + g_mutex_unlock(&g_rec_idle_event_lock); g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc)_recorder_idle_event_callback, @@ -1184,9 +1158,6 @@ static recorder_cb_info_s *_recorder_client_callback_new(gint sockfd) g_cond_init(&cb_info->api_cond[i]); } - g_mutex_init(&cb_info->idle_event_mutex); - g_cond_init(&cb_info->idle_event_cond); - for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++) g_mutex_init(&cb_info->user_cb_mutex[i]); @@ -1235,9 +1206,6 @@ ErrorExit: for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++) g_mutex_clear(&cb_info->user_cb_mutex[i]); - g_mutex_clear(&cb_info->idle_event_mutex); - g_cond_clear(&cb_info->idle_event_cond); - for (i = 0 ; i < MUSE_RECORDER_API_MAX ; i++) { g_mutex_clear(&cb_info->api_mutex[i]); g_cond_clear(&cb_info->api_cond[i]); @@ -1412,9 +1380,6 @@ static void _recorder_client_callback_destroy(recorder_cb_info_s *cb_info) for (i = 0 ; i < MUSE_RECORDER_EVENT_TYPE_NUM ; i++) g_mutex_clear(&cb_info->user_cb_mutex[i]); - g_mutex_clear(&cb_info->idle_event_mutex); - g_cond_clear(&cb_info->idle_event_cond); - for (i = 0 ; i < MUSE_RECORDER_API_MAX ; i++) { g_mutex_clear(&cb_info->api_mutex[i]); g_cond_clear(&cb_info->api_cond[i]);