g_cond_init(&_webrtc->desc_cond);
g_mutex_init(&_webrtc->stats_mutex);
g_cond_init(&_webrtc->stats_cond);
+ g_mutex_init(&_webrtc->destroy_mutex);
_load_ini(_webrtc);
if (_is_resource_required(&_webrtc->ini)) {
{
int ret = WEBRTC_ERROR_NONE;
g_autoptr(GMutexLocker) locker = NULL;
+ g_autoptr(GMutexLocker) d_locker = NULL;
webrtc_s *_webrtc = (webrtc_s *)webrtc;
RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
locker = g_mutex_locker_new(&_webrtc->mutex);
+ d_locker = g_mutex_locker_new(&_webrtc->destroy_mutex);
- _remove_remained_event_sources(_webrtc);
-
+ _webrtc->is_destroying = true;
_webrtc->pend_state = WEBRTC_STATE_IDLE;
+ _remove_remained_event_sources(_webrtc);
+
_unset_stats_timer(_webrtc);
ret = _gst_pipeline_set_state(_webrtc, GST_STATE_NULL);
_webrtc->state = _webrtc->pend_state;
_destroy_data_channels(_webrtc);
+
+ g_clear_pointer(&d_locker, g_mutex_locker_free);
_gst_destroy_pipeline(_webrtc);
+
_unload_ini(_webrtc);
#if !defined(TIZEN_TV) && defined(TIZEN_FEATURE_UI)
LOG_INFO("webrtc[%p] is destroyed", webrtc);
+ g_mutex_clear(&_webrtc->destroy_mutex);
g_clear_pointer(&locker, g_mutex_locker_free);
g_mutex_clear(&_webrtc->mutex);
g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtc == NULL, "webrtc is NULL");
+ RET_IF(webrtc->is_destroying, "webrtc is destroying, skip it");
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtc == NULL, "webrtc is NULL");
+ RET_IF(webrtc->is_destroying, "webrtc is destroying, skip it");
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtc == NULL, "webrtc is NULL");
+ RET_IF(webrtc->is_destroying, "webrtc is destroying, skip it");
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtc == NULL, "webrtc is NULL");
+ RET_IF(webrtc->is_destroying, "webrtc is destroying, skip it");
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
{
webrtc_s *webrtc = (webrtc_s *)user_data;
GstWebRTCPeerConnectionState state;
+ g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
RET_IF(webrtc == NULL, "webrtc is NULL");
LOG_DEBUG("webrtc[%p] [PeerConnectionState] is changed to [%s]", webrtc, __peer_connection_state_info[state].str);
+ locker = g_mutex_locker_new(&webrtc->destroy_mutex);
+
__post_peer_connection_state_change_cb_in_idle(webrtc, __peer_connection_state_info[state].state);
switch (state) {
case GST_WEBRTC_PEER_CONNECTION_STATE_CONNECTED:
- g_mutex_lock(&webrtc->mutex);
if (webrtc->state == WEBRTC_STATE_NEGOTIATING)
_post_state_cb_in_idle(webrtc, WEBRTC_STATE_PLAYING);
- g_mutex_unlock(&webrtc->mutex);
break;
case GST_WEBRTC_PEER_CONNECTION_STATE_FAILED:
+ g_clear_pointer(&locker, g_mutex_locker_free);
__invoke_error_cb(webrtc, WEBRTC_ERROR_CONNECTION_FAILED);
break;
{
webrtc_s *webrtc = (webrtc_s *)user_data;
GstWebRTCSignalingState state;
+ g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
RET_IF(webrtc == NULL, "webrtc is NULL");
state == GST_WEBRTC_SIGNALING_STATE_STABLE)
__update_data_recovery_type_from_remote_description(webrtc);
+ locker = g_mutex_locker_new(&webrtc->destroy_mutex);
+
__post_signaling_state_change_cb_in_idle(webrtc, __signaling_state_info[state].state);
}
{
webrtc_s *webrtc = (webrtc_s *)user_data;
GstWebRTCICEGatheringState state;
+ g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
RET_IF(webrtc == NULL, "webrtc is NULL");
LOG_DEBUG("webrtc[%p] [IceGatheringState] is changed to [%s]", webrtc, __ice_gathering_state_info[state].str);
+ locker = g_mutex_locker_new(&webrtc->destroy_mutex);
+
__post_ice_gathering_state_change_cb_in_idle(webrtc, __ice_gathering_state_info[state].state);
}
{
webrtc_s *webrtc = (webrtc_s *)user_data;
GstWebRTCICEConnectionState state;
+ g_autoptr(GMutexLocker) locker = NULL;
RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
RET_IF(webrtc == NULL, "webrtc is NULL");
LOG_DEBUG("webrtc[%p] [IceConnectionState] is changed to [%s]", webrtc, __ice_connection_state_info[state].str);
+ locker = g_mutex_locker_new(&webrtc->destroy_mutex);
+
__post_ice_connection_state_change_cb_in_idle(webrtc, __ice_connection_state_info[state].state);
if (state == GST_WEBRTC_ICE_CONNECTION_STATE_FAILED)