mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 11:11:05 +00:00
Merge "bridge_channel: Don't settle owed events on an optimization." into 13
This commit is contained in:
@@ -84,7 +84,7 @@ struct ast_bridge_channel *bridge_channel_internal_alloc(struct ast_bridge *brid
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Clear owed events by the channel to the original bridge.
|
||||
* \brief Settle owed events by the channel to the original bridge.
|
||||
* \since 12.0.0
|
||||
*
|
||||
* \param orig_bridge Original bridge the channel was in before leaving.
|
||||
@@ -116,6 +116,27 @@ void bridge_channel_settle_owed_events(struct ast_bridge *orig_bridge, struct as
|
||||
*/
|
||||
int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel);
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Push the bridge channel into its specified bridge.
|
||||
* \since 13.8.0
|
||||
*
|
||||
* \param bridge_channel Channel to push.
|
||||
* \param optimized non-zero if the push with swap is for an optimization.
|
||||
*
|
||||
* \note A ref is not held by bridge_channel->swap when calling because the
|
||||
* push with swap happens immediately.
|
||||
*
|
||||
* \note On entry, bridge_channel->bridge is already locked.
|
||||
*
|
||||
* \retval 0 on success.
|
||||
* \retval -1 on failure. The channel did not get pushed.
|
||||
*
|
||||
* \note On failure the caller must call
|
||||
* ast_bridge_features_remove(bridge_channel->features, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
|
||||
*/
|
||||
int bridge_channel_internal_push_full(struct ast_bridge_channel *bridge_channel, int optimized);
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Pull the bridge channel out of its current bridge.
|
||||
|
@@ -2187,7 +2187,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);
|
||||
@@ -2200,7 +2200,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,
|
||||
@@ -2208,7 +2207,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);
|
||||
}
|
||||
|
||||
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user