fix race condition in double loopback bowout
This commit is contained in:
parent
74dd18fe97
commit
b04e4be512
|
@ -709,10 +709,26 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void switch_channel_wait_for_state_or_greater(switch_channel_t *channel, switch_channel_t *other_channel, switch_channel_state_t want_state)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch_assert(channel);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if ((switch_channel_get_state(channel) < CS_HANGUP &&
|
||||||
|
switch_channel_get_state(channel) == switch_channel_get_running_state(channel) && switch_channel_get_running_state(channel) == want_state) ||
|
||||||
|
(other_channel && switch_channel_down_nosig(other_channel)) || switch_channel_down(channel)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch_cond_next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static switch_status_t find_non_loopback_bridge(switch_core_session_t *session, switch_core_session_t **br_session, const char **br_uuid)
|
static switch_status_t find_non_loopback_bridge(switch_core_session_t *session, switch_core_session_t **br_session, const char **br_uuid)
|
||||||
{
|
{
|
||||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||||
const char *a_uuid;
|
const char *a_uuid = NULL;
|
||||||
switch_core_session_t *sp;
|
switch_core_session_t *sp;
|
||||||
|
|
||||||
*br_session = NULL;
|
*br_session = NULL;
|
||||||
|
@ -722,9 +738,17 @@ static switch_status_t find_non_loopback_bridge(switch_core_session_t *session,
|
||||||
|
|
||||||
while (a_uuid && (sp = switch_core_session_locate(a_uuid))) {
|
while (a_uuid && (sp = switch_core_session_locate(a_uuid))) {
|
||||||
if (switch_core_session_check_interface(sp, loopback_endpoint_interface)) {
|
if (switch_core_session_check_interface(sp, loopback_endpoint_interface)) {
|
||||||
private_t *tech_pvt = switch_core_session_get_private(sp);
|
private_t *tech_pvt;
|
||||||
|
switch_channel_t *spchan = switch_core_session_get_channel(sp);
|
||||||
|
|
||||||
|
switch_channel_wait_for_state_or_greater(spchan, channel, CS_ROUTING);
|
||||||
|
|
||||||
|
tech_pvt = switch_core_session_get_private(sp);
|
||||||
|
|
||||||
|
if (tech_pvt->other_channel) {
|
||||||
|
a_uuid = switch_channel_get_partner_uuid(tech_pvt->other_channel);
|
||||||
|
}
|
||||||
|
|
||||||
a_uuid = switch_channel_get_partner_uuid(tech_pvt->other_channel);
|
|
||||||
switch_core_session_rwunlock(sp);
|
switch_core_session_rwunlock(sp);
|
||||||
sp = NULL;
|
sp = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue