webrtc_private: Change of mutex used for unintended purposes 33/319033/1
authorYoungwoo Cho <young222.cho@samsung.com>
Thu, 10 Oct 2024 06:50:30 +0000 (15:50 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 14 Oct 2024 01:18:29 +0000 (10:18 +0900)
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 <young222.cho@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc.c
src/webrtc_private.c

index 995b692e6556a9213491c9993057ea94afc3fe58..de39e75ce279960883b1f5ef054eac456b3ae4c3 100644 (file)
@@ -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;
index f7f0f2b9687d9eb8b98efc0e6fffd4885c972c7e..859fa00988003ebbc1fab485b5c8ba3acd1614e0 100644 (file)
@@ -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
index 9544a24c34f1565fe0704f483deab050a47b5258..4ef50e00c03c49bc662805697e620a03d7c00ac5 100644 (file)
@@ -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);
index db9b22f528fcf947be5859fad04e20b2c05145f1..a9d7b37823983c278f0cc9b0b2bf944cf3cdaeab 100644 (file)
@@ -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;
 }