diff options
-rw-r--r-- | main/channel.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/main/channel.c b/main/channel.c index 415af35e2..577ab03ae 100644 --- a/main/channel.c +++ b/main/channel.c @@ -7516,8 +7516,11 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct if (ast_channel_softhangup_internal_flag(c1) & AST_SOFTHANGUP_UNBRIDGE) { ast_channel_clear_softhangup(c1, AST_SOFTHANGUP_UNBRIDGE); } + ast_channel_lock_both(c0, c1); ast_channel_internal_bridged_channel_set(c0, c1); ast_channel_internal_bridged_channel_set(c1, c0); + ast_channel_unlock(c0); + ast_channel_unlock(c1); } continue; } @@ -7799,8 +7802,11 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha } /* Keep track of bridge */ + ast_channel_lock_both(c0, c1); ast_channel_internal_bridged_channel_set(c0, c1); ast_channel_internal_bridged_channel_set(c1, c0); + ast_channel_unlock(c0); + ast_channel_unlock(c1); ast_set_owners_and_peers(c0, c1); @@ -7896,8 +7902,11 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha if (ast_channel_softhangup_internal_flag(c1) & AST_SOFTHANGUP_UNBRIDGE) { ast_channel_clear_softhangup(c1, AST_SOFTHANGUP_UNBRIDGE); } + ast_channel_lock_both(c0, c1); ast_channel_internal_bridged_channel_set(c0, c1); ast_channel_internal_bridged_channel_set(c1, c0); + ast_channel_unlock(c0); + ast_channel_unlock(c1); } /* Stop if we're a zombie or need a soft hangup */ @@ -7990,8 +7999,11 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha ast_indicate(c0, AST_CONTROL_SRCUPDATE); ast_indicate(c1, AST_CONTROL_SRCUPDATE); + ast_channel_lock_both(c0, c1); ast_channel_internal_bridged_channel_set(c0, NULL); ast_channel_internal_bridged_channel_set(c1, NULL); + ast_channel_unlock(c0); + ast_channel_unlock(c1); manager_bridge_event(0, 1, c0, c1); ast_debug(1, "Bridge stops bridging channels %s and %s\n", ast_channel_name(c0), ast_channel_name(c1)); |