From: Sangchul Lee Date: Fri, 18 Feb 2022 10:25:46 +0000 (+0900) Subject: Add more mutex guard for callbacks X-Git-Tag: submit/tizen_6.5/20220304.023524~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F00%2F271900%2F1;p=platform%2Fcore%2Fapi%2Fwebrtc.git Add more mutex guard for callbacks [Version] 0.2.161 [Issue Type] Improvement Change-Id: I1f536532c3c4bac4101d68c125197d80b267856f Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 281aaef3..42485781 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -416,6 +416,7 @@ typedef struct _webrtc_s { guint stats_timer_src; GMutex mutex; + GMutex event_src_mutex; GMutex desc_mutex; GCond desc_cond; diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 81459057..1b38d242 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.2.160 +Version: 0.2.161 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc.c b/src/webrtc.c index 9406af9b..2a67eea1 100644 --- a/src/webrtc.c +++ b/src/webrtc.c @@ -82,7 +82,7 @@ int webrtc_create(webrtc_h *webrtc) g_mutex_init(&_webrtc->mutex); locker = g_mutex_locker_new(&_webrtc->mutex); - + g_mutex_init(&_webrtc->event_src_mutex); g_mutex_init(&_webrtc->desc_mutex); g_cond_init(&_webrtc->desc_cond); @@ -149,8 +149,9 @@ int webrtc_destroy(webrtc_h webrtc) _gst_destroy_pipeline(_webrtc); _unload_ini(_webrtc); - g_mutex_clear(&_webrtc->desc_mutex); g_cond_clear(&_webrtc->desc_cond); + g_mutex_clear(&_webrtc->desc_mutex); + g_mutex_clear(&_webrtc->event_src_mutex); LOG_INFO("webrtc[%p] is destroyed", webrtc); diff --git a/src/webrtc_private.c b/src/webrtc_private.c index eebcadf5..62a91e5e 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -438,36 +438,57 @@ static gboolean __idle_cb(gpointer user_data) webrtc_state_e old_state; g_mutex_lock(&webrtc->mutex); - + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = 0; + g_mutex_unlock(&webrtc->event_src_mutex); old_state = webrtc->state; webrtc->state = data->new.state; - g_mutex_unlock(&webrtc->mutex); _invoke_state_changed_cb(webrtc, old_state, webrtc->state); break; } + case IDLE_CB_TYPE_ERROR: + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = 0; + g_mutex_unlock(&webrtc->event_src_mutex); + __invoke_error_cb(webrtc, data->new.error); break; + case IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE: + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = 0; + g_mutex_unlock(&webrtc->event_src_mutex); + __invoke_peer_connection_state_change_cb(webrtc, data->new.peer_connection_state); break; + case IDLE_CB_TYPE_SIGNALING_STATE_CHANGE: + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = 0; + g_mutex_unlock(&webrtc->event_src_mutex); + __invoke_signaling_state_change_cb(webrtc, data->new.signaling_state); break; + case IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE: + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = 0; + g_mutex_unlock(&webrtc->event_src_mutex); + __invoke_ice_gathering_state_change_cb(webrtc, data->new.ice_gathering_state); break; + case IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE: + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = 0; + g_mutex_unlock(&webrtc->event_src_mutex); + __invoke_ice_connection_state_change_cb(webrtc, data->new.ice_connection_state); break; + default: LOG_ERROR_IF_REACHED("type(%d)", data->type); } @@ -505,7 +526,9 @@ void _post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state) webrtc->pend_state = new_state; + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + g_mutex_unlock(&webrtc->event_src_mutex); LOG_DEBUG("state will be changed [%s] -> [%s], source id[%u]", __state_str[webrtc->state], __state_str[new_state], webrtc->idle_cb_event_source_ids[data->type]); @@ -523,7 +546,9 @@ void _post_error_cb_in_idle(webrtc_s *webrtc, webrtc_error_e error) data->type = IDLE_CB_TYPE_ERROR; data->new.error = error; + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + g_mutex_unlock(&webrtc->event_src_mutex); LOG_DEBUG("error will occur [0x%x], source id[%u]", error, webrtc->idle_cb_event_source_ids[data->type]); } @@ -539,7 +564,9 @@ static void __post_peer_connection_state_change_cb_in_idle(webrtc_s *webrtc, web data->type = IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE; data->new.peer_connection_state = state; + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + g_mutex_unlock(&webrtc->event_src_mutex); LOG_DEBUG("connection state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); } @@ -556,7 +583,9 @@ static void __post_signaling_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_si data->type = IDLE_CB_TYPE_SIGNALING_STATE_CHANGE; data->new.signaling_state = state; + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + g_mutex_unlock(&webrtc->event_src_mutex); LOG_DEBUG("signaling state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); } @@ -572,7 +601,9 @@ static void __post_ice_gathering_state_change_cb_in_idle(webrtc_s *webrtc, webrt data->type = IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE; data->new.ice_gathering_state = state; + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + g_mutex_unlock(&webrtc->event_src_mutex); LOG_DEBUG("ICE gathering state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); } @@ -589,7 +620,9 @@ static void __post_ice_connection_state_change_cb_in_idle(webrtc_s *webrtc, webr data->type = IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE; data->new.ice_connection_state = state; + g_mutex_lock(&webrtc->event_src_mutex); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + g_mutex_unlock(&webrtc->event_src_mutex); LOG_DEBUG("ICE connection state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); }