]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7344: Fix race condition for INVITE right after ACK in 3PCC mode.
authorArtur Zaprzała <zapartur@gmail.com>
Thu, 3 Sep 2015 13:11:30 +0000 (15:11 +0200)
committerArtur Zaprzała <zapartur@gmail.com>
Thu, 3 Sep 2015 20:32:32 +0000 (22:32 +0200)
src/include/switch_ivr.h
src/switch_channel.c
src/switch_ivr.c

index 7bb00cb06bab4577d50b7878cec4ceacae45cd2d..63acdf42aa328ab42c7e3563cf477f8b3e9ffd39 100644 (file)
@@ -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);
 
 /*!
index 47eadef2e65513ad52469aebc68f8428308d5679..dfc23213f638288e121dd8c0a1162426ddcd14d4 100644 (file)
@@ -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;
 }
 
index 1bf876c44192cf1227b1837a81bedffcf47ec670..fab6c2c7ef345f37d40561c0c6dbceb9c09e6718 100644 (file)
@@ -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;