[svn-commits] file: branch file/bridging_colp r392028 - /team/file/bridging_colp/main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jun 17 10:39:56 CDT 2013


Author: file
Date: Mon Jun 17 10:39:54 2013
New Revision: 392028

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=392028
Log:
Only update connected line information from non-unreal and non-Local channels and also don't update when merging or swapping due to optimization.

Modified:
    team/file/bridging_colp/main/bridging.c

Modified: team/file/bridging_colp/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/file/bridging_colp/main/bridging.c?view=diff&rev=392028&r1=392027&r2=392028
==============================================================================
--- team/file/bridging_colp/main/bridging.c (original)
+++ team/file/bridging_colp/main/bridging.c Mon Jun 17 10:39:54 2013
@@ -61,6 +61,7 @@
 #include "asterisk/cli.h"
 #include "asterisk/parking.h"
 #include "asterisk/core_local.h"
+#include "asterisk/core_unreal.h"
 #include "asterisk/features_config.h"
 
 /*! All bridges container. */
@@ -498,7 +499,8 @@
 	struct ast_party_connected_line connected;
 	struct ast_bridge_channel *peer;
 
-	if (!(bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_1TO1MIX)) {
+	if (!(bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_1TO1MIX) ||
+		(ast_channel_tech(bridge_channel->chan)->write == ast_unreal_write)) {
 		return;
 	}
 
@@ -518,12 +520,13 @@
  * \since 12.0.0
  *
  * \param bridge_channel Channel to pull.
+ * \param optimized Whether this pull is the result of an optimization.
  *
  * \note On entry, bridge_channel->bridge is already locked.
  *
  * \return Nothing
  */
-static void bridge_channel_pull(struct ast_bridge_channel *bridge_channel)
+static void bridge_channel_pull(struct ast_bridge_channel *bridge_channel, unsigned int optimized)
 {
 	struct ast_bridge *bridge = bridge_channel->bridge;
 
@@ -547,7 +550,9 @@
 		}
 	}
 
-	bridge_channel_pull_connected_line_update(bridge_channel);
+	if (!optimized) {
+		bridge_channel_pull_connected_line_update(bridge_channel);
+	}
 
 	/* Remove channel from the bridge */
 	if (!bridge_channel->suspended) {
@@ -580,7 +585,8 @@
 	struct ast_party_connected_line connected;
 
 	if (!(bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_1TO1MIX) ||
-		!(peer = ast_bridge_channel_peer(bridge_channel))) {
+		!(peer = ast_bridge_channel_peer(bridge_channel)) ||
+		(ast_channel_tech(bridge_channel->chan)->write == ast_unreal_write)) {
 		return;
 	}
 
@@ -605,13 +611,14 @@
  * \since 12.0.0
  *
  * \param bridge_channel Channel to push.
+ * \param optimized Whether this push is the result of an optimization.
  *
  * \note On entry, bridge_channel->bridge is already locked.
  *
  * \retval 0 on success.
  * \retval -1 on failure.  The channel did not get pushed.
  */
-static int bridge_channel_push(struct ast_bridge_channel *bridge_channel)
+static int bridge_channel_push(struct ast_bridge_channel *bridge_channel, unsigned int optimized)
 {
 	struct ast_bridge *bridge = bridge_channel->bridge;
 	struct ast_bridge_channel *swap;
@@ -649,10 +656,12 @@
 	}
 	if (swap) {
 		ast_bridge_change_state(swap, AST_BRIDGE_CHANNEL_STATE_HANGUP);
-		bridge_channel_pull(swap);
-	}
-
-	bridge_channel_push_connected_line_update(bridge_channel);
+		bridge_channel_pull(swap, optimized);
+	}
+
+	if (!optimized) {
+		bridge_channel_push_connected_line_update(bridge_channel);
+	}
 
 	/* Clear any BLINDTRANSFER since the transfer has completed. */
 	pbx_builtin_setvar_helper(bridge_channel->chan, "BLINDTRANSFER", NULL);
@@ -2908,7 +2917,7 @@
 		bridge_channel->bridge->callid = ast_read_threadstorage_callid();
 	}
 
-	if (bridge_channel_push(bridge_channel)) {
+	if (bridge_channel_push(bridge_channel, 0)) {
 		ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
 	}
 	bridge_reconfigured(bridge_channel->bridge);
@@ -2934,7 +2943,7 @@
 		ast_bridge_channel_lock_bridge(bridge_channel);
 	}
 
-	bridge_channel_pull(bridge_channel);
+	bridge_channel_pull(bridge_channel, 0);
 	bridge_reconfigured(bridge_channel->bridge);
 
 	ast_bridge_unlock(bridge_channel->bridge);
@@ -3845,7 +3854,8 @@
  * This moves the channels in src_bridge into the bridge pointed
  * to by dst_bridge.
  */
-static void bridge_merge_do(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_bridge_channel **kick_me, unsigned int num_kick)
+static void bridge_merge_do(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_bridge_channel **kick_me, unsigned int num_kick,
+	unsigned int optimized)
 {
 	struct ast_bridge_channel *bridge_channel;
 	unsigned int idx;
@@ -3882,7 +3892,7 @@
 				}
 			}
 		}
-		bridge_channel_pull(bridge_channel);
+		bridge_channel_pull(bridge_channel, optimized);
 		if (bridge_channel->state != AST_BRIDGE_CHANNEL_STATE_WAIT) {
 			/*
 			 * The channel died as a result of being pulled or it was
@@ -3894,7 +3904,7 @@
 		/* Point to new bridge.*/
 		bridge_channel_change_bridge(bridge_channel, dst_bridge);
 
-		if (bridge_channel_push(bridge_channel)) {
+		if (bridge_channel_push(bridge_channel, optimized)) {
 			ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
 		}
 	}
@@ -3910,7 +3920,7 @@
 			ast_bridge_channel_lock(bridge_channel);
 			if (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
 				ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
-				bridge_channel_pull(bridge_channel);
+				bridge_channel_pull(bridge_channel, optimized);
 			}
 			ast_bridge_channel_unlock(bridge_channel);
 		}
@@ -4085,7 +4095,7 @@
 		}
 	}
 
-	bridge_merge_do(merge.dest, merge.src, kick_them, num_kick);
+	bridge_merge_do(merge.dest, merge.src, kick_them, num_kick, 0);
 	return 0;
 }
 
@@ -4117,7 +4127,8 @@
  * \retval 0 on success.
  * \retval -1 on failure.
  */
-static int bridge_move_do(struct ast_bridge *dst_bridge, struct ast_bridge_channel *bridge_channel, int attempt_recovery)
+static int bridge_move_do(struct ast_bridge *dst_bridge, struct ast_bridge_channel *bridge_channel, int attempt_recovery,
+	unsigned int optimized)
 {
 	struct ast_bridge *orig_bridge;
 	int was_in_bridge;
@@ -4136,7 +4147,7 @@
 	orig_bridge = bridge_channel->bridge;
 	was_in_bridge = bridge_channel->in_bridge;
 
-	bridge_channel_pull(bridge_channel);
+	bridge_channel_pull(bridge_channel, optimized);
 	if (bridge_channel->state != AST_BRIDGE_CHANNEL_STATE_WAIT) {
 		/*
 		 * The channel died as a result of being pulled.  Leave it
@@ -4150,13 +4161,13 @@
 	ao2_ref(orig_bridge, +1);/* Keep a ref in case the push fails. */
 	bridge_channel_change_bridge(bridge_channel, dst_bridge);
 
-	if (bridge_channel_push(bridge_channel)) {
+	if (bridge_channel_push(bridge_channel, optimized)) {
 		/* Try to put the channel back into the original bridge. */
 		if (attempt_recovery && was_in_bridge) {
 			/* Point back to original bridge. */
 			bridge_channel_change_bridge(bridge_channel, orig_bridge);
 
-			if (bridge_channel_push(bridge_channel)) {
+			if (bridge_channel_push(bridge_channel, optimized)) {
 				ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
 			}
 		} else {
@@ -4245,7 +4256,7 @@
 	}
 
 	bridge_channel->swap = swap;
-	return bridge_move_do(dst_bridge, bridge_channel, attempt_recovery);
+	return bridge_move_do(dst_bridge, bridge_channel, attempt_recovery, 0);
 }
 
 int ast_bridge_move(struct ast_bridge *dst_bridge, struct ast_bridge *src_bridge, struct ast_channel *chan, struct ast_channel *swap, int attempt_recovery)
@@ -4481,7 +4492,7 @@
 			ast_channel_name(other->chan));
 
 		other->swap = dst_bridge_channel->chan;
-		if (!bridge_move_do(dst_bridge, other, 1)) {
+		if (!bridge_move_do(dst_bridge, other, 1, 1)) {
 			ast_bridge_change_state(src_bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
 			res = -1;
 		}
@@ -4581,7 +4592,7 @@
 		ast_channel_name(chan_bridge_channel->chan),
 		ast_channel_name(peer_bridge_channel->chan));
 
-	bridge_merge_do(merge.dest, merge.src, kick_me, ARRAY_LEN(kick_me));
+	bridge_merge_do(merge.dest, merge.src, kick_me, ARRAY_LEN(kick_me), 1);
 
 	return -1;
 }
@@ -6019,7 +6030,7 @@
 		&& !ast_test_flag(&bridged_to_source->features->feature_flags,
 			AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE)) {
 		bridged_to_source->swap = swap_channel;
-		if (bridge_move_do(dest_bridge, bridged_to_source, 1)) {
+		if (bridge_move_do(dest_bridge, bridged_to_source, 1, 0)) {
 			return AST_BRIDGE_TRANSFER_FAIL;
 		}
 		/* Must kick the source channel out of its bridge. */
@@ -6066,10 +6077,10 @@
 	case AST_BRIDGE_OPTIMIZE_SWAP_TO_PEER_BRIDGE:
 		return bridge_swap_attended_transfer(to_target_bridge, to_transferee_bridge_channel, to_transfer_target);
 	case AST_BRIDGE_OPTIMIZE_MERGE_TO_CHAN_BRIDGE:
-		bridge_merge_do(to_transferee_bridge, to_target_bridge, kick_me, ARRAY_LEN(kick_me));
+		bridge_merge_do(to_transferee_bridge, to_target_bridge, kick_me, ARRAY_LEN(kick_me), 0);
 		return AST_BRIDGE_TRANSFER_SUCCESS;
 	case AST_BRIDGE_OPTIMIZE_MERGE_TO_PEER_BRIDGE:
-		bridge_merge_do(to_target_bridge, to_transferee_bridge, kick_me, ARRAY_LEN(kick_me));
+		bridge_merge_do(to_target_bridge, to_transferee_bridge, kick_me, ARRAY_LEN(kick_me), 0);
 		return AST_BRIDGE_TRANSFER_SUCCESS;
 	case AST_BRIDGE_OPTIMIZE_PROHIBITED:
 	default:




More information about the svn-commits mailing list