From: Youngwoo Cho Date: Thu, 10 Oct 2024 06:50:30 +0000 (+0900) Subject: webrtc_private: Change of mutex used for unintended purposes X-Git-Tag: accepted/tizen/8.0/unified/20241014.163637~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=650151d5ad7e077a114cf6629b8de079d9f7628b;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_private: Change of mutex used for unintended purposes desc_mutex/cond was made to protect description. but signaling_state_cb has used desc_mutex/cond to ensure signaling state change before returning of _webrtcbin_set_session_description() (from e73ac03c4aa1e8a144d0ced1d12af43685d3b712) User want to set_local_description() in offer_created_cb because that is good way in the flow. but, offer_created_cb uses desc_mutex/cond and _webrtcbin_set_session_description() uses too. that caused deadlock, so we divide mutex/cond. [Version] 0.4.67 [Issue Type] Bug fix Change-Id: Ia2a665b70818889e275308dfe94ad0019ec62312 Signed-off-by: Youngwoo Cho --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 995b692e..de39e75c 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -506,6 +506,8 @@ typedef struct _webrtc_s { GMutex state_mutex; GCond state_cond; GMutex event_src_mutex; + GMutex signaling_state_mutex; + GCond signaling_state_cond; GMutex desc_mutex; GCond desc_cond; GMutex stats_mutex; diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index f7f0f2b9..859fa009 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.4.66 +Version: 0.4.67 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc.c b/src/webrtc.c index 9544a24c..4ef50e00 100644 --- a/src/webrtc.c +++ b/src/webrtc.c @@ -98,6 +98,8 @@ int webrtc_create(webrtc_h *webrtc) g_mutex_init(&_webrtc->state_mutex); g_cond_init(&_webrtc->state_cond); g_mutex_init(&_webrtc->event_src_mutex); + g_mutex_init(&_webrtc->signaling_state_mutex); + g_cond_init(&_webrtc->signaling_state_cond); g_mutex_init(&_webrtc->desc_mutex); g_cond_init(&_webrtc->desc_cond); g_mutex_init(&_webrtc->stats_mutex); @@ -149,6 +151,8 @@ error: g_mutex_clear(&_webrtc->state_mutex); g_cond_clear(&_webrtc->state_cond); g_mutex_clear(&_webrtc->event_src_mutex); + g_mutex_clear(&_webrtc->signaling_state_mutex); + g_cond_clear(&_webrtc->signaling_state_cond); g_mutex_clear(&_webrtc->desc_mutex); g_cond_clear(&_webrtc->desc_cond); g_mutex_clear(&_webrtc->stats_mutex); @@ -210,6 +214,8 @@ int webrtc_destroy(webrtc_h webrtc) g_mutex_clear(&_webrtc->stats_mutex); g_cond_clear(&_webrtc->desc_cond); g_mutex_clear(&_webrtc->desc_mutex); + g_cond_clear(&_webrtc->signaling_state_cond); + g_mutex_clear(&_webrtc->signaling_state_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 db9b22f5..a9d7b378 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -1224,9 +1224,9 @@ static void __webrtcbin_signaling_state_cb(GstElement *webrtcbin, GParamSpec * p locker = g_mutex_locker_new(&webrtc->destroy_mutex); - g_mutex_lock(&webrtc->desc_mutex); - g_cond_signal(&webrtc->desc_cond); - g_mutex_unlock(&webrtc->desc_mutex); + g_mutex_lock(&webrtc->signaling_state_mutex); + g_cond_signal(&webrtc->signaling_state_cond); + g_mutex_unlock(&webrtc->signaling_state_mutex); __post_signaling_state_change_cb_in_idle(webrtc, __signaling_state_info[state].state); } @@ -2095,7 +2095,7 @@ int _webrtcbin_set_session_description(webrtc_s *webrtc, const char *description sdp_type = g_str_equal(type, "answer") ? GST_WEBRTC_SDP_TYPE_ANSWER : GST_WEBRTC_SDP_TYPE_OFFER; desc = gst_webrtc_session_description_new(sdp_type, gst_sdp); - g_mutex_lock(&webrtc->desc_mutex); + g_mutex_lock(&webrtc->signaling_state_mutex); promise = gst_promise_new(); g_signal_emit_by_name(webrtc->gst.webrtcbin, is_remote ? "set-remote-description" : "set-local-description", desc, promise); @@ -2116,10 +2116,10 @@ int _webrtcbin_set_session_description(webrtc_s *webrtc, const char *description LOG_DEBUG("wait for invoking __webrtcbin_signaling_state_cb()"); end_time = g_get_monotonic_time() + 3 * G_TIME_SPAN_SECOND; - if (!g_cond_wait_until(&webrtc->desc_cond, &webrtc->desc_mutex, end_time)) + if (!g_cond_wait_until(&webrtc->signaling_state_cond, &webrtc->signaling_state_mutex, end_time)) LOG_WARNING("timeout of g_cond_wait_until()"); - g_mutex_unlock(&webrtc->desc_mutex); + g_mutex_unlock(&webrtc->signaling_state_mutex); return WEBRTC_ERROR_NONE; }