]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
don't parse signals in the set_running_state function to avoid livelock situation
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 2 Sep 2011 21:59:59 +0000 (16:59 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Mon, 9 Jul 2012 22:28:15 +0000 (18:28 -0400)
src/include/switch_channel.h
src/switch_channel.c

index 176b841147f1596e6aa548beb03ac89b6781f493..a4e44083df946e862e3012c9066cb5d89aced095 100644 (file)
@@ -87,6 +87,10 @@ SWITCH_DECLARE(int) switch_channel_test_ready(switch_channel_t *channel, switch_
 
 #define switch_channel_up(_channel) (switch_channel_check_signal(_channel, SWITCH_TRUE) || switch_channel_get_state(_channel) < CS_HANGUP)
 #define switch_channel_down(_channel) (switch_channel_check_signal(_channel, SWITCH_TRUE) || switch_channel_get_state(_channel) >= CS_HANGUP)
+
+#define switch_channel_up_nosig(_channel) switch_channel_get_state(_channel) < CS_HANGUP
+#define switch_channel_down_nosig(_channel) switch_channel_get_state(_channel) >= CS_HANGUP
+
 #define switch_channel_media_ack(_channel) (!switch_channel_test_cap(_channel, CC_MEDIA_ACK) || switch_channel_test_flag(_channel, CF_MEDIA_ACK))
 
 SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, switch_channel_t *other_channel, switch_channel_state_t want_state);
index 3f96616794208fa57ebe73a09293eb618035535e..c11754d48a1ffa922729948f8f4f759ea39718aa 100644 (file)
@@ -1839,8 +1839,11 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_set_running_state(
                                                                                           channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound");
                                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Presence-Call-Direction",
                                                                                           channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound");
-
-                               if (switch_channel_down(channel)) {
+                               switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-HIT-Dialplan", 
+                                                                                          switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND ||
+                                                                                          switch_channel_test_flag(channel, CF_DIALPLAN) ? "true" : "false");
+                               
+                               if (switch_channel_down_nosig(channel)) {
                                        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "hangup");
                                } else if (switch_channel_test_flag(channel, CF_ANSWERED)) {
                                        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "answered");
@@ -2123,7 +2126,7 @@ SWITCH_DECLARE(void) switch_channel_event_set_basic_data(switch_channel_t *chann
                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-Call-UUID", v);
        }
 
-       if (switch_channel_down(channel)) {
+       if (switch_channel_down_nosig(channel)) {
                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "hangup");
        } else if (switch_channel_test_flag(channel, CF_ANSWERED)) {
                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Answer-State", "answered");