From: Sangchul Lee Date: Mon, 9 May 2022 10:53:43 +0000 (+0900) Subject: webrtc_private: Clear event source not fired before overwriting it X-Git-Tag: submit/tizen_6.5/20220510.064024^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=16077898c7206c70adefd6385e800c5209e3aaf7;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_private: Clear event source not fired before overwriting it It was an issue with a short test case that results a crash in sometimes. [Version] 0.2.169 [Issue Type] Bug fix Change-Id: Ic82742df40438d7077d7f44585099d4694d0f707 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 42485781..eff2e567 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -212,6 +212,15 @@ do { \ g_free(dot_name); \ } while (0) +#define CLEAR_IDLE_CB_EVENT_SOURCE_ID(x_webrtc, x_idx) \ +do { \ + if (x_webrtc->idle_cb_event_source_ids[x_idx] == 0) break; \ + g_source_remove(x_webrtc->idle_cb_event_source_ids[x_idx]); \ + LOG_DEBUG("webrtc[%p] idle_cb_event_source_ids[%d] source id[%u] is removed", \ + x_webrtc, x_idx, x_webrtc->idle_cb_event_source_ids[x_idx]); \ + x_webrtc->idle_cb_event_source_ids[x_idx] = 0; \ +} while (0) + #define DEFAULT_ELEMENT_FAKESINK "fakesink" #define DEFAULT_ELEMENT_AUDIOCONVERT "audioconvert" #define DEFAULT_ELEMENT_AUDIORESAMPLE "audioresample" diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 1acd0492..a04029ce 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.168 +Version: 0.2.169 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_private.c b/src/webrtc_private.c index 717c3787..c518f30a 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -513,13 +513,8 @@ void _remove_remained_event_sources(webrtc_s *webrtc) int i; RET_IF(webrtc == NULL, "webrtc is NULL"); - for (i = IDLE_CB_TYPE_STATE; i < IDLE_CB_TYPE_NUM; i++) { - if (webrtc->idle_cb_event_source_ids[i] == 0) - continue; - g_source_remove(webrtc->idle_cb_event_source_ids[i]); - LOG_DEBUG("idle_cb_event_source_ids[%d] source id[%u]", i, webrtc->idle_cb_event_source_ids[i]); - webrtc->idle_cb_event_source_ids[i] = 0; - } + for (i = IDLE_CB_TYPE_STATE; i < IDLE_CB_TYPE_NUM; i++) + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, i); } void _post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state) @@ -540,10 +535,11 @@ void _post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state) webrtc->pend_state = new_state; locker = g_mutex_locker_new(&webrtc->event_src_mutex); + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, data->type); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); - 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]); + LOG_DEBUG("webrtc[%p] state will be changed [%s] -> [%s], source id[%u]", + webrtc, __state_str[webrtc->state], __state_str[new_state], webrtc->idle_cb_event_source_ids[data->type]); } //LCOV_EXCL_START @@ -560,9 +556,11 @@ void _post_error_cb_in_idle(webrtc_s *webrtc, webrtc_error_e error) data->new.error = error; locker = g_mutex_locker_new(&webrtc->event_src_mutex); + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, data->type); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); - LOG_DEBUG("error will occur [0x%x], source id[%u]", error, webrtc->idle_cb_event_source_ids[data->type]); + LOG_DEBUG("webrtc[%p] error will occur [0x%x], source id[%u]", + webrtc, error, webrtc->idle_cb_event_source_ids[data->type]); } static void __post_peer_connection_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_peer_connection_state_e state) @@ -578,9 +576,11 @@ static void __post_peer_connection_state_change_cb_in_idle(webrtc_s *webrtc, web data->new.peer_connection_state = state; locker = g_mutex_locker_new(&webrtc->event_src_mutex); + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, data->type); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); - LOG_DEBUG("connection state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); + LOG_DEBUG("webrtc[%p] connection state will be changed to [%u], source id[%u]", + webrtc, state, webrtc->idle_cb_event_source_ids[data->type]); } //LCOV_EXCL_STOP @@ -597,9 +597,11 @@ static void __post_signaling_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_si data->new.signaling_state = state; locker = g_mutex_locker_new(&webrtc->event_src_mutex); + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, data->type); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); - LOG_DEBUG("signaling state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); + LOG_DEBUG("webrtc[%p] signaling state will be changed to [%u], source id[%u]", + webrtc, state, webrtc->idle_cb_event_source_ids[data->type]); } static void __post_ice_gathering_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_ice_gathering_state_e state) @@ -615,9 +617,11 @@ static void __post_ice_gathering_state_change_cb_in_idle(webrtc_s *webrtc, webrt data->new.ice_gathering_state = state; locker = g_mutex_locker_new(&webrtc->event_src_mutex); + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, data->type); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); - LOG_DEBUG("ICE gathering state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); + LOG_DEBUG("webrtc[%p] ICE gathering state will be changed to [%u], source id[%u]", + webrtc, state, webrtc->idle_cb_event_source_ids[data->type]); } //LCOV_EXCL_START @@ -634,9 +638,11 @@ static void __post_ice_connection_state_change_cb_in_idle(webrtc_s *webrtc, webr data->new.ice_connection_state = state; locker = g_mutex_locker_new(&webrtc->event_src_mutex); + CLEAR_IDLE_CB_EVENT_SOURCE_ID(webrtc, data->type); webrtc->idle_cb_event_source_ids[data->type] = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); - LOG_DEBUG("ICE connection state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]); + LOG_DEBUG("webrtc[%p] ICE connection state will be changed to [%u], source id[%u]", + webrtc, state, webrtc->idle_cb_event_source_ids[data->type]); } //LCOV_EXCL_STOP