}
//LCOV_EXCL_STOP
-typedef enum _post_idle_cb_type_e {
- POST_IDLE_CB_TYPE_STATE,
- POST_IDLE_CB_TYPE_ERROR,
- POST_IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE,
- POST_IDLE_CB_TYPE_SIGNALING_STATE_CHANGE,
- POST_IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE,
- POST_IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE
-} post_idle_cb_type_e;
-
typedef struct _idle_userdata {
webrtc_s *webrtc;
- post_idle_cb_type_e type;
+ idle_cb_type_e type;
union {
webrtc_state_e state;
webrtc_error_e error;
webrtc = data->webrtc;
switch (data->type) {
- case POST_IDLE_CB_TYPE_STATE: {
+ case IDLE_CB_TYPE_STATE: {
webrtc_state_e old_state;
g_mutex_lock(&webrtc->mutex);
+ webrtc->idle_cb_event_source_ids[data->type] = 0;
old_state = webrtc->state;
webrtc->state = data->new.state;
_invoke_state_changed_cb(webrtc, old_state, webrtc->state);
break;
}
- case POST_IDLE_CB_TYPE_ERROR:
+ case IDLE_CB_TYPE_ERROR:
+ webrtc->idle_cb_event_source_ids[data->type] = 0;
__invoke_error_cb(webrtc, data->new.error);
break;
- case POST_IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE:
+ case IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE:
+ webrtc->idle_cb_event_source_ids[data->type] = 0;
__invoke_peer_connection_state_change_cb(webrtc, data->new.peer_connection_state);
break;
- case POST_IDLE_CB_TYPE_SIGNALING_STATE_CHANGE:
+ case IDLE_CB_TYPE_SIGNALING_STATE_CHANGE:
+ webrtc->idle_cb_event_source_ids[data->type] = 0;
__invoke_signaling_state_change_cb(webrtc, data->new.signaling_state);
break;
- case POST_IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE:
+ case IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE:
+ webrtc->idle_cb_event_source_ids[data->type] = 0;
__invoke_ice_gathering_state_change_cb(webrtc, data->new.ice_gathering_state);
break;
- case POST_IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE:
+ case IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE:
+ webrtc->idle_cb_event_source_ids[data->type] = 0;
__invoke_ice_connection_state_change_cb(webrtc, data->new.ice_connection_state);
break;
default:
return G_SOURCE_REMOVE;
}
+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;
+ }
+}
+
void _post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state)
{
idle_userdata_s *data;
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
- data->type = POST_IDLE_CB_TYPE_STATE;
+ data->type = IDLE_CB_TYPE_STATE;
data->new.state = new_state;
webrtc->pend_state = new_state;
- g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free);
+ 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]", __state_str[webrtc->state], __state_str[new_state]);
+ 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]);
}
//LCOV_EXCL_START
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
- data->type = POST_IDLE_CB_TYPE_ERROR;
+ data->type = IDLE_CB_TYPE_ERROR;
data->new.error = error;
- g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free);
+ 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]", error);
+ LOG_DEBUG("error will occur [0x%x], source id[%u]", 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)
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
- data->type = POST_IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE;
+ data->type = IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE;
data->new.peer_connection_state = state;
- g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free);
+ 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]", state);
+ LOG_DEBUG("connection state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]);
}
//LCOV_EXCL_STOP
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
- data->type = POST_IDLE_CB_TYPE_SIGNALING_STATE_CHANGE;
+ data->type = IDLE_CB_TYPE_SIGNALING_STATE_CHANGE;
data->new.signaling_state = state;
- g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free);
+ 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]", state);
+ LOG_DEBUG("signaling state will be changed to [%u], source id[%u]", 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)
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
- data->type = POST_IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE;
+ data->type = IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE;
data->new.ice_gathering_state = state;
- g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free);
+ 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]", state);
+ LOG_DEBUG("ICE gathering state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]);
}
//LCOV_EXCL_START
data = g_new0(idle_userdata_s, 1);
data->webrtc = webrtc;
- data->type = POST_IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE;
+ data->type = IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE;
data->new.ice_connection_state = state;
- g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free);
+ 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]", state);
+ LOG_DEBUG("ICE connection state will be changed to [%u], source id[%u]", state, webrtc->idle_cb_event_source_ids[data->type]);
}
//LCOV_EXCL_STOP