From 19d49e2075c9abdae9b839b2ef070a2e26b7872b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 11 Jan 2012 12:05:16 -0600 Subject: [PATCH] fix edge case endless loop that can get a channel stuck --- src/switch_channel.c | 2 +- src/switch_ivr_bridge.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 435c2a3929..df3bedeacf 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1383,7 +1383,7 @@ SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, sw switch_assert(channel); for (;;) { - if ((channel->state == channel->running_state && channel->running_state == want_state) || + if ((channel->state < CS_HANGUP && channel->state == channel->running_state && channel->running_state == want_state) || (other_channel && switch_channel_down_nosig(other_channel)) || switch_channel_down_nosig(channel)) { break; } diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 6fd926d6c5..3096f9cf92 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -776,17 +776,17 @@ static switch_status_t uuid_bridge_on_soft_execute(switch_core_session_t *sessio state = switch_channel_get_state(other_channel); running_state = switch_channel_get_running_state(other_channel); - if (state == running_state) { + if (switch_channel_down_nosig(other_channel) || switch_channel_down_nosig(channel)) { + break; + } + + if (state < CS_HANGUP && state == running_state) { if (--loops < 1) { switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); switch_channel_hangup(other_channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } - if (switch_channel_down_nosig(other_channel) || switch_channel_down_nosig(channel)) { - break; - } - if (running_state == CS_RESET) { switch_channel_set_state(other_channel, CS_SOFT_EXECUTE); } @@ -803,7 +803,7 @@ static switch_status_t uuid_bridge_on_soft_execute(switch_core_session_t *sessio } else { loops = max; } - + switch_yield(20000); }