switch_codec_interface_t *codecs[SWITCH_MAX_CODECS];
int num_codecs;
switch_payload_t te;
+ switch_mutex_t *flag_mutex;
};
}
/* Let Media Work */
- switch_set_flag(tech_pvt, TFLAG_IO);
+ switch_set_flag_locked(tech_pvt, TFLAG_IO);
/* Move Channel's State Machine to RING */
switch_channel_set_state(channel, CS_RING);
deactivate_rtp(tech_pvt);
eXosip_lock();
switch_core_hash_delete(globals.call_hash, tech_pvt->call_id);
- switch_set_flag(tech_pvt, TFLAG_BYE);
- switch_clear_flag(tech_pvt, TFLAG_IO);
+ switch_set_flag_locked(tech_pvt, TFLAG_BYE);
+ switch_clear_flag_locked(tech_pvt, TFLAG_IO);
i = eXosip_call_terminate(tech_pvt->cid, tech_pvt->did);
eXosip_unlock();
if (!(key = (char *) switch_core_hash_find(globals.srtp_hash, tech_pvt->realm))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "undefined Realm %s\n", tech_pvt->realm);
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
- switch_set_flag(tech_pvt, TFLAG_BYE);
- switch_clear_flag(tech_pvt, TFLAG_IO);
+ switch_set_flag_locked(tech_pvt, TFLAG_BYE);
+ switch_clear_flag_locked(tech_pvt, TFLAG_IO);
return SWITCH_STATUS_FALSE;
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "using Realm %s\n", tech_pvt->realm);
uint8_t inb = switch_test_flag(tech_pvt, TFLAG_OUTBOUND) ? 0 : 1;
tech_pvt->ssrc = switch_rtp_get_ssrc(tech_pvt->rtp_session);
- switch_set_flag(tech_pvt, TFLAG_RTP);
+ switch_set_flag_locked(tech_pvt, TFLAG_RTP);
if (tech_pvt->te > 96) {
switch_rtp_set_telephony_event(tech_pvt->rtp_session, tech_pvt->te);
if ((vad_in && inb) || (vad_out && !inb)) {
switch_rtp_enable_vad(tech_pvt->rtp_session, tech_pvt->session, &tech_pvt->read_codec, SWITCH_VAD_FLAG_TALKING);
- switch_set_flag(tech_pvt, TFLAG_VAD);
+ switch_set_flag_locked(tech_pvt, TFLAG_VAD);
}
} else {
switch_channel_t *channel = switch_core_session_get_channel(tech_pvt->session);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "RTP REPORTS ERROR: [%s]\n", err);
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
- switch_set_flag(tech_pvt, TFLAG_BYE);
- switch_clear_flag(tech_pvt, TFLAG_IO);
+ switch_set_flag_locked(tech_pvt, TFLAG_BYE);
+ switch_clear_flag_locked(tech_pvt, TFLAG_IO);
return SWITCH_STATUS_FALSE;
}
free(buf);
eXosip_call_send_answer(tech_pvt->tid, 200, answer);
eXosip_unlock();
- switch_set_flag(tech_pvt, TFLAG_ANS);
+ switch_set_flag_locked(tech_pvt, TFLAG_ANS);
sdp_message_to_str(tech_pvt->local_sdp, &sdp_str);
if (sdp_str) {
assert(tech_pvt != NULL);
tech_pvt->read_frame.datalen = 0;
- switch_set_flag(tech_pvt, TFLAG_READING);
+ switch_set_flag_locked(tech_pvt, TFLAG_READING);
if (switch_test_flag(tech_pvt, TFLAG_USING_CODEC)) {
bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
}
- switch_clear_flag(tech_pvt, TFLAG_READING);
+ switch_clear_flag_locked(tech_pvt, TFLAG_READING);
if (switch_test_flag(tech_pvt, TFLAG_BYE)) {
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
return SWITCH_STATUS_FALSE;
}
- switch_set_flag(tech_pvt, TFLAG_WRITING);
+ switch_set_flag_locked(tech_pvt, TFLAG_WRITING);
if (switch_test_flag(tech_pvt, TFLAG_USING_CODEC)) {
bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
tech_pvt->timestamp_send += (int) samples;
- switch_clear_flag(tech_pvt, TFLAG_WRITING);
+ switch_clear_flag_locked(tech_pvt, TFLAG_WRITING);
return status;
}
tech_pvt = switch_core_session_get_private(session);
assert(tech_pvt != NULL);
- switch_clear_flag(tech_pvt, TFLAG_IO);
- switch_set_flag(tech_pvt, TFLAG_BYE);
+ switch_clear_flag_locked(tech_pvt, TFLAG_IO);
+ switch_set_flag_locked(tech_pvt, TFLAG_BYE);
if (tech_pvt->rtp_session) {
switch_rtp_kill_socket(tech_pvt->rtp_session);
osip_message_set_content_type(progress, "application/sdp");
free(buf);
eXosip_call_send_answer(tech_pvt->tid, 183, progress);
- switch_set_flag(tech_pvt, TFLAG_EARLY_MEDIA);
+ switch_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA);
switch_channel_set_flag(channel, CF_EARLY_MEDIA);
sdp_message_to_str(tech_pvt->local_sdp, &sdp_str);
if (sdp_str) {
switch_core_session_set_private(*new_session, tech_pvt);
tech_pvt->session = *new_session;
tech_pvt->te = globals.te;
+ switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, module_pool);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Hey where is my memory pool?\n");
switch_core_session_destroy(new_session);
}
switch_channel_set_flag(channel, CF_OUTBOUND);
- switch_set_flag(tech_pvt, TFLAG_OUTBOUND);
+ switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND);
switch_channel_set_state(channel, CS_INIT);
return SWITCH_STATUS_SUCCESS;
}
switch_core_session_set_private(session, tech_pvt);
tech_pvt->session = session;
tech_pvt->te = globals.te;
+ switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, module_pool);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Hey where is my memory pool?\n");
switch_core_session_destroy(&session);
switch_channel_set_caller_profile(channel, tech_pvt->caller_profile);
}
- switch_set_flag(tech_pvt, TFLAG_INBOUND);
+ switch_set_flag_locked(tech_pvt, TFLAG_INBOUND);
tech_pvt->did = event->did;
tech_pvt->cid = event->cid;
tech_pvt->tid = event->tid;
} else {
int ms;
tech_pvt->read_frame.rate = rate;
- switch_set_flag(tech_pvt, TFLAG_USING_CODEC);
+ switch_set_flag_locked(tech_pvt, TFLAG_USING_CODEC);
ms = tech_pvt->write_codec.implementation->microseconds_per_frame / 1000;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Activate Inbound Codec %s/%d %d ms\n", dname, rate, ms);
tech_pvt->read_frame.codec = &tech_pvt->read_codec;
} else {
int ms;
tech_pvt->read_frame.rate = rate;
- switch_set_flag(tech_pvt, TFLAG_USING_CODEC);
+ switch_set_flag_locked(tech_pvt, TFLAG_USING_CODEC);
ms = tech_pvt->write_codec.implementation->microseconds_per_frame / 1000;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Activate Outbound Codec %s/%d %d ms\n", dname, rate, ms);
tech_pvt->read_frame.codec = &tech_pvt->read_codec;