diff options
Diffstat (limited to 'main/bridge.c')
-rw-r--r-- | main/bridge.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/main/bridge.c b/main/bridge.c index 8fd7847ec..8acf260d1 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -2524,7 +2524,13 @@ static int try_swap_optimize_out(struct ast_bridge *chan_bridge, other = ast_bridge_channel_peer(src_bridge_channel); if (other && other->state == BRIDGE_CHANNEL_STATE_WAIT) { - unsigned int id = ast_atomic_fetchadd_int((int *) &optimization_id, +1); + unsigned int id; + + if (ast_channel_trylock(other->chan)) { + return 1; + } + + id = ast_atomic_fetchadd_int((int *) &optimization_id, +1); ast_verb(3, "Move-swap optimizing %s <-- %s.\n", ast_channel_name(dst_bridge_channel->chan), @@ -2546,6 +2552,7 @@ static int try_swap_optimize_out(struct ast_bridge *chan_bridge, if (pvt && pvt->callbacks && pvt->callbacks->optimization_finished) { pvt->callbacks->optimization_finished(pvt, res == 1, id); } + ast_channel_unlock(other->chan); } return res; } |