Revise critical section regarding state/pend_state 88/245888/3
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 19 Oct 2020 06:38:25 +0000 (15:38 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 19 Oct 2020 07:43:53 +0000 (16:43 +0900)
Add codes to lock/unlock mutex during checking state/pend_state
in __ms_bus_cb() and ms_webrtcbin_notify_ice_connection_state_cb().

ms_trigger_state_cb() is added to only invoke the user callback
without locking/unlocking the mutex.

This patch is to fix the bug reported by
 - https://github.sec.samsung.net/tizen/mediastreamer/issues/20

[Issue Type] Bug fix
[Version] 0.1.126

Change-Id: Idb5b66ec47b0491d5dc5e9825158d46ba885249f
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/media_streamer_priv.h
packaging/capi-media-streamer.spec
src/media_streamer_gst.c
src/media_streamer_gst_webrtc.c
src/media_streamer_priv.c

index c81344c..e63fdc2 100644 (file)
@@ -219,7 +219,7 @@ int ms_create(media_streamer_s *ms_streamer);
  */
 int ms_set_state(media_streamer_s *ms_streamer, media_streamer_state_e state);
 
-void ms_update_state_from_pend_state(media_streamer_s *ms_streamer);
+void ms_trigger_state_cb(media_streamer_s *ms_streamer, media_streamer_state_e old_state);
 
 #ifdef __cplusplus
 }
index 6579526..f89e3ba 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamer
 Summary:    A Media Streamer API
-Version:    0.1.125
+Version:    0.1.126
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index c7cf997..9bb5c8b 100644 (file)
@@ -2047,6 +2047,7 @@ static gboolean __ms_bus_cb(GstBus *bus, GstMessage *message, gpointer userdata)
        GstState gst_state_old = GST_STATE_VOID_PENDING;
        GstState gst_state_new = GST_STATE_VOID_PENDING;
        GstState gst_state_pending = GST_STATE_VOID_PENDING;
+       media_streamer_state_e old_state;
 
        ms_streamer = (media_streamer_s *) userdata;
        ms_retvm_if(ms_streamer == NULL, FALSE, "Handle is NULL");
@@ -2085,18 +2086,27 @@ static gboolean __ms_bus_cb(GstBus *bus, GstMessage *message, gpointer userdata)
                if (gst_state_new < GST_STATE_PAUSED)
                        break;
 
+               g_mutex_lock(&ms_streamer->mutex_lock);
+
                if (ms_streamer->pend_state == ms_streamer->state) {
                        ms_info("pend_state(%d) is same with current state(%d), skip triggering callback.",
                                        ms_streamer->pend_state, ms_streamer->state);
+                       g_mutex_unlock(&ms_streamer->mutex_lock);
                        break;
                }
 
                if(__ms_skip_set_state(ms_streamer)) {
                        ms_info("Skip set state, state is set after connecting ICE connection.");
+                       g_mutex_unlock(&ms_streamer->mutex_lock);
                        break;
                }
 
-               ms_update_state_from_pend_state(ms_streamer);
+               old_state = ms_streamer->state;
+               ms_streamer->state = ms_streamer->pend_state;
+
+               g_mutex_unlock(&ms_streamer->mutex_lock);
+
+               ms_trigger_state_cb(ms_streamer, old_state);
                break;
 
        case GST_MESSAGE_ASYNC_DONE:
index 3d1d3cb..3a1641b 100644 (file)
@@ -506,9 +506,17 @@ void ms_webrtcbin_notify_ice_connection_state_cb(GstElement *webrtcbin, GParamSp
 
        ms_info("ICE connection state changed to [%s]", new_state);
 
+       g_mutex_lock(&ms_streamer->mutex_lock);
        if (ice_connection_state == GST_WEBRTC_ICE_CONNECTION_STATE_CONNECTED &&
-               ms_streamer->pend_state == MEDIA_STREAMER_STATE_READY)
-               ms_update_state_from_pend_state(ms_streamer);
+               ms_streamer->pend_state == MEDIA_STREAMER_STATE_READY) {
+               media_streamer_state_e old_state = ms_streamer->state;
+               ms_streamer->state = ms_streamer->pend_state;
+               g_mutex_unlock(&ms_streamer->mutex_lock);
+
+               ms_trigger_state_cb(ms_streamer, old_state);
+               return;
+       }
+       g_mutex_unlock(&ms_streamer->mutex_lock);
 }
 
 
index 09663dd..6aa6455 100644 (file)
@@ -29,20 +29,12 @@ static int __ms_resource_release_cb(mm_resource_manager_h rm,
 static int __ms_acquire_resources(media_streamer_s *ms_streamer);
 static int __ms_release_resources(media_streamer_s *ms_streamer);
 
-void ms_update_state_from_pend_state(media_streamer_s *ms_streamer)
+void ms_trigger_state_cb(media_streamer_s *ms_streamer, media_streamer_state_e old_state)
 {
-       GstState old_state;
-
        ms_retm_if(ms_streamer == NULL, "ms_streamer is NULL");
 
-       g_mutex_lock(&ms_streamer->mutex_lock);
-
-       old_state = ms_streamer->state;
-       ms_streamer->state = ms_streamer->pend_state;
        ms_info("Media streamer state changed [%d] -> [%d]", old_state, ms_streamer->state);
 
-       g_mutex_unlock(&ms_streamer->mutex_lock);
-
        if (ms_streamer->state_changed_cb.callback) {
                ms_debug(">>> state changed callback(%p) START", ms_streamer->state_changed_cb.callback);