summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-03-01 06:00:03 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-03-01 06:00:04 -0600
commit916cc68585da952364cd8b55cbad8142ceb52f4e (patch)
tree7ff3e1e9ded1766fd4eb5ef53c3fb48752bb23a3 /main
parent806e4a664f80d9774c99f6f06903b2c162d0f506 (diff)
parent86f7336c91bb3fcd0704143ed93d41275080b2e4 (diff)
Merge "bridge_channel: Don't settle owed events on an optimization."
Diffstat (limited to 'main')
-rw-r--r--main/bridge.c5
-rw-r--r--main/bridge_channel.c26
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.