webrtc_private: Change of mutex used for unintended purposes 78/318878/2
authorYoungwoo Cho <young222.cho@samsung.com>
Thu, 10 Oct 2024 06:50:30 +0000 (15:50 +0900)
committerYoungwoo Cho <young222.cho@samsung.com>
Fri, 11 Oct 2024 01:44:54 +0000 (10:44 +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] 1.1.35
[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 6f0a92923fe26a3aa6d6e6c940f67c93a87ce029..97c9324845fe57954f3672fedbe2dfbf49d141c5 100644 (file)
@@ -513,6 +513,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 4df014859c8ffa79ec858d1b5d8e9f0b08e540d2..3e0afd343656cc8db890fa7eb7afe4564b703ea3 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    1.1.34
+Version:    1.1.35
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index cc0206ab4f92bd4c04b5e1acdc6354706d63ac6a..7bea58999988d7d4fa9f801cdf83e7c2f7cad75c 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 016a8d4f43885ee5514804d7ea30c0d3cbb95dd4..4a26377bfdb272e2e2d591fe11f7aff090a75267 100644 (file)
@@ -1226,9 +1226,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);
 }
@@ -2097,7 +2097,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);
@@ -2118,10 +2118,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;
 }