webrtc_private: Clear event source not fired before overwriting it 07/274807/1 submit/tizen_6.5/20220510.064024
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 9 May 2022 10:53:43 +0000 (19:53 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 9 May 2022 23:02:17 +0000 (08:02 +0900)
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 <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_private.c

index 424857814be492680bcf2f1e4f6f4ceca9ab0b82..eff2e5673a02409eb0e921c35e4724cdea12dbff 100644 (file)
@@ -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"
index 1acd0492b58eb6d97b41e7ed8dfe22a2cdc671e3..a04029ce8712565cdf648a16a7542864e78ae211 100644 (file)
@@ -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
index 717c3787b26e09d271a74839ba3856cbcbf5daca..c518f30abe71ff1d6ffcd94e7879461de08a1862 100644 (file)
@@ -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