diff options
author | Joshua Colp <jcolp@digium.com> | 2016-03-01 06:00:03 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-03-01 06:00:04 -0600 |
commit | 916cc68585da952364cd8b55cbad8142ceb52f4e (patch) | |
tree | 7ff3e1e9ded1766fd4eb5ef53c3fb48752bb23a3 /main | |
parent | 806e4a664f80d9774c99f6f06903b2c162d0f506 (diff) | |
parent | 86f7336c91bb3fcd0704143ed93d41275080b2e4 (diff) |
Merge "bridge_channel: Don't settle owed events on an optimization."
Diffstat (limited to 'main')
-rw-r--r-- | main/bridge.c | 5 | ||||
-rw-r--r-- | main/bridge_channel.c | 26 |
2 files changed, 27 insertions, 4 deletions
diff --git a/main/bridge.c b/main/bridge.c index 7451a163c..77865757e 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -2185,7 +2185,7 @@ int bridge_do_move(struct ast_bridge *dst_bridge, struct ast_bridge_channel *bri bridge_channel_moving(bridge_channel, orig_bridge, dst_bridge); - if (bridge_channel_internal_push(bridge_channel)) { + if (bridge_channel_internal_push_full(bridge_channel, optimized)) { /* Try to put the channel back into the original bridge. */ ast_bridge_features_remove(bridge_channel->features, AST_BRIDGE_HOOK_REMOVE_ON_PULL); @@ -2198,7 +2198,6 @@ int bridge_do_move(struct ast_bridge *dst_bridge, struct ast_bridge_channel *bri AST_BRIDGE_HOOK_REMOVE_ON_PULL); ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, bridge_channel->bridge->cause); - bridge_channel_settle_owed_events(orig_bridge, bridge_channel); } } else { ast_bridge_channel_leave_bridge(bridge_channel, @@ -2206,7 +2205,7 @@ int bridge_do_move(struct ast_bridge *dst_bridge, struct ast_bridge_channel *bri bridge_channel_settle_owed_events(orig_bridge, bridge_channel); } res = -1; - } else { + } else if (!optimized) { bridge_channel_settle_owed_events(orig_bridge, bridge_channel); } diff --git a/main/bridge_channel.c b/main/bridge_channel.c index f3483e440..3f141452e 100644 --- a/main/bridge_channel.c +++ b/main/bridge_channel.c @@ -675,6 +675,22 @@ static int bridge_channel_write_frame(struct ast_bridge_channel *bridge_channel, return 0; } +/*! + * \internal + * \brief Cancel owed events by the channel to the bridge. + * \since 13.8.0 + * + * \param bridge_channel Channel that owes events to the bridge. + * + * \note On entry, the bridge_channel->bridge is already locked. + * + * \return Nothing + */ +static void bridge_channel_cancel_owed_events(struct ast_bridge_channel *bridge_channel) +{ + bridge_channel->owed.dtmf_digit = '\0'; +} + void bridge_channel_settle_owed_events(struct ast_bridge *orig_bridge, struct ast_bridge_channel *bridge_channel) { if (bridge_channel->owed.dtmf_digit) { @@ -2037,7 +2053,7 @@ void bridge_channel_internal_pull(struct ast_bridge_channel *bridge_channel) ast_bridge_publish_leave(bridge, bridge_channel->chan); } -int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel) +int bridge_channel_internal_push_full(struct ast_bridge_channel *bridge_channel, int optimized) { struct ast_bridge *bridge = bridge_channel->bridge; struct ast_bridge_channel *swap; @@ -2073,6 +2089,9 @@ int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel) /* This flag is cleared so the act of this channel leaving does not cause it to dissolve if need be */ ast_clear_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_DISSOLVE_EMPTY); + if (optimized) { + bridge_channel_cancel_owed_events(swap); + } ast_bridge_channel_leave_bridge(swap, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, 0); bridge_channel_internal_pull(swap); @@ -2112,6 +2131,11 @@ int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel) return 0; } +int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel) +{ + return bridge_channel_internal_push_full(bridge_channel, 0); +} + /*! * \internal * \brief Handle bridge channel control frame action. |