From: Artur ZaprzaƂa Date: Thu, 3 Sep 2015 13:11:30 +0000 (+0200) Subject: FS-7344: Fix race condition for INVITE right after ACK in 3PCC mode. X-Git-Tag: v1.6.2~1^2~94^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ea99bfccfa85ef94b13693db6489aec3dca2c88;p=thirdparty%2Ffreeswitch.git FS-7344: Fix race condition for INVITE right after ACK in 3PCC mode. --- diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index 7bb00cb06b..63acdf42aa 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -122,6 +122,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_events(switch_core_session_ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_next_event(switch_core_session_t *session); SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_messages(switch_core_session_t *session); SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_session_t *session); +SWITCH_DECLARE(switch_status_t) switch_ivr_parse_next_signal_data(switch_core_session_t *session); SWITCH_DECLARE(switch_status_t) switch_ivr_process_indications(switch_core_session_t *session, switch_core_session_message_t *message); /*! diff --git a/src/switch_channel.c b/src/switch_channel.c index 47eadef2e6..dfc23213f6 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -2100,10 +2100,8 @@ SWITCH_DECLARE(int) switch_channel_state_change_pending(switch_channel_t *channe SWITCH_DECLARE(int) switch_channel_check_signal(switch_channel_t *channel, switch_bool_t in_thread_only) { - if (!in_thread_only || switch_core_session_in_thread(channel->session)) { - switch_ivr_parse_all_signal_data(channel->session); - } - + (void)in_thread_only; + switch_ivr_parse_next_signal_data(channel->session); return 0; } diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 1bf876c441..fab6c2c7ef 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -820,7 +820,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_messages(switch_core_sessio } -SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_session_t *session) +static switch_status_t switch_ivr_parse_signal_data(switch_core_session_t *session, switch_bool_t all) { void *data; switch_core_session_message_t msg = { 0 }; @@ -847,7 +847,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_ses switch_core_session_receive_message(session, &msg); data = NULL; - + if (!all) + break; } switch_channel_clear_flag(channel, CF_SIGNAL_DATA); @@ -855,6 +856,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_ses return i ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; } +SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_signal_data(switch_core_session_t *session) { + return switch_ivr_parse_signal_data(session, SWITCH_TRUE); +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_parse_next_signal_data(switch_core_session_t *session) { + return switch_ivr_parse_signal_data(session, SWITCH_FALSE); +} + SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_events(switch_core_session_t *session) { int x = 0;