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;
}
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);
}
} else {
loops = max;
}
-
+
switch_yield(20000);
}