[svn-commits] rmudgett: branch group/bridge_construction r381014 - /team/group/bridge_const...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Feb 6 18:50:52 CST 2013


Author: rmudgett
Date: Wed Feb  6 18:50:48 2013
New Revision: 381014

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=381014
Log:
Fixup some AST_BRIDGE_CHANNEL_STATE_DEPART_END use cases and use more switch state forms.

Modified:
    team/group/bridge_construction/main/bridging.c
    team/group/bridge_construction/main/features.c

Modified: team/group/bridge_construction/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/group/bridge_construction/main/bridging.c?view=diff&rev=381014&r1=381013&r2=381014
==============================================================================
--- team/group/bridge_construction/main/bridging.c (original)
+++ team/group/bridge_construction/main/bridging.c Wed Feb  6 18:50:48 2013
@@ -309,12 +309,10 @@
 	AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
 		ao2_lock(bridge_channel);
 		switch (bridge_channel->state) {
-		case AST_BRIDGE_CHANNEL_STATE_END:
-		case AST_BRIDGE_CHANNEL_STATE_HANGUP:
-		case AST_BRIDGE_CHANNEL_STATE_DEPART:
+		case AST_BRIDGE_CHANNEL_STATE_WAIT:
+			ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
 			break;
 		default:
-			ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
 			break;
 		}
 		ao2_unlock(bridge_channel);
@@ -462,8 +460,12 @@
 		if (!frame || (frame->frametype == AST_FRAME_CONTROL && frame->subclass.integer == AST_CONTROL_HANGUP)) {
 			/* Signal the thread that is handling the bridged channel that it should be ended */
 			ao2_lock(bridge_channel);
-			if (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
+			switch (bridge_channel->state) {
+			case AST_BRIDGE_CHANNEL_STATE_WAIT:
 				ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_END);
+				break;
+			default:
+				break;
 			}
 			ao2_unlock(bridge_channel);
 		} else if (frame->frametype == AST_FRAME_CONTROL && bridge_drop_control_frame(frame->subclass.integer)) {
@@ -1170,8 +1172,12 @@
 		 */
 		if (bridge_channel->chan && ast_check_hangup_locked(bridge_channel->chan)) {
 			ao2_lock(bridge_channel);
-			if (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
+			switch (bridge_channel->state) {
+			case AST_BRIDGE_CHANNEL_STATE_WAIT:
 				ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_END);
+				break;
+			default:
+				break;
 			}
 			ao2_unlock(bridge_channel);
 		}
@@ -1311,8 +1317,12 @@
 		if (bridge_channel2) {
 			ast_debug(1, "Swapping bridge channel %p out from bridge %p so bridge channel %p can slip in\n", bridge_channel2, bridge_channel->bridge, bridge_channel);
 			ao2_lock(bridge_channel2);
-			if (bridge_channel2->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
+			switch (bridge_channel2->state) {
+			case AST_BRIDGE_CHANNEL_STATE_WAIT:
 				ast_bridge_change_state_nolock(bridge_channel2, AST_BRIDGE_CHANNEL_STATE_HANGUP);
+				break;
+			default:
+				break;
 			}
 			ao2_unlock(bridge_channel2);
 		}
@@ -1418,11 +1428,16 @@
 	bridge_channel->bridge->num--;
 	AST_LIST_REMOVE(&bridge_channel->bridge->channels, bridge_channel, entry);
 
-	if (bridge_channel->depart_wait
-		&& bridge_channel->state != AST_BRIDGE_CHANNEL_STATE_DEPART
-		&& bridge_channel->state != AST_BRIDGE_CHANNEL_STATE_DEPART_END) {
-		/* Put the channel into the ast_bridge_depart wait list. */
-		AST_LIST_INSERT_TAIL(&bridge_channel->bridge->depart_wait, bridge_channel, entry);
+	if (bridge_channel->depart_wait) {
+		switch (bridge_channel->state) {
+		case AST_BRIDGE_CHANNEL_STATE_DEPART:
+		case AST_BRIDGE_CHANNEL_STATE_DEPART_END:
+			break;
+		default:
+			/* Put the channel into the ast_bridge_depart wait list. */
+			AST_LIST_INSERT_TAIL(&bridge_channel->bridge->depart_wait, bridge_channel, entry);
+			break;
+		}
 	}
 
 	bridge_array_remove(bridge_channel->bridge, bridge_channel->chan);
@@ -1569,14 +1584,13 @@
 /* BUGBUG need to determine where to execute in the dialplan. */
 	switch (state) {
 	case AST_BRIDGE_CHANNEL_STATE_DEPART:
+	case AST_BRIDGE_CHANNEL_STATE_DEPART_END:
 		ast_log(LOG_ERROR, "Independently imparted channel was departed: %s\n",
 			ast_channel_name(chan));
 		ast_assert(0);
 		/* fallthrough */
 	case AST_BRIDGE_CHANNEL_STATE_HANGUP:
 	case AST_BRIDGE_CHANNEL_STATE_END:
-		ast_hangup(chan);
-		break;
 	default:
 		ast_hangup(chan);
 		break;
@@ -1647,6 +1661,15 @@
 			case AST_BRIDGE_CHANNEL_STATE_END:
 				ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_DEPART_END);
 				break;
+			case AST_BRIDGE_CHANNEL_STATE_DEPART:
+			case AST_BRIDGE_CHANNEL_STATE_DEPART_END:
+				/*
+				 * Should never happen.  It likely means that
+				 * ast_bridge_depart() is called by two threads for the same
+				 * channel.
+				 */
+				ast_assert(0);
+				break;
 			default:
 				ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_DEPART);
 				break;
@@ -1694,8 +1717,12 @@
 	}
 
 	ao2_lock(bridge_channel);
-	if (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
+	switch (bridge_channel->state) {
+	case AST_BRIDGE_CHANNEL_STATE_WAIT:
 		ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
+		break;
+	default:
+		break;
 	}
 	ao2_unlock(bridge_channel);
 
@@ -1995,8 +2022,12 @@
 	}
 
 	ao2_lock(bridge_channel);
-	if (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT){
+	switch (bridge_channel->state) {
+	case AST_BRIDGE_CHANNEL_STATE_WAIT:
 		ast_bridge_change_state_nolock(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
+		break;
+	default:
+		break;
 	}
 	ao2_unlock(bridge_channel);
 

Modified: team/group/bridge_construction/main/features.c
URL: http://svnview.digium.com/svn/asterisk/team/group/bridge_construction/main/features.c?view=diff&rev=381014&r1=381013&r2=381014
==============================================================================
--- team/group/bridge_construction/main/features.c (original)
+++ team/group/bridge_construction/main/features.c Wed Feb  6 18:50:48 2013
@@ -4672,27 +4672,21 @@
 	}
 
 	/* Join bridge */
+	ast_bridge_join(bridge, chan, NULL, &chan_features, NULL);
+
+	/*
+	 * If the bridge was broken for a hangup that isn't real, then
+	 * don't run the h extension, because the channel isn't really
+	 * hung up.  This should really only happen with
+	 * AST_SOFTHANGUP_ASYNCGOTO.
+	 */
 	res = -1;
-	switch (ast_bridge_join(bridge, chan, NULL, &chan_features, NULL)) {
-	case AST_BRIDGE_CHANNEL_STATE_END:
-	case AST_BRIDGE_CHANNEL_STATE_HANGUP:
-	case AST_BRIDGE_CHANNEL_STATE_DEPART:
-		/*
-		 * If the bridge was broken for a hangup that isn't real, then
-		 * don't run the h extension, because the channel isn't really
-		 * hung up.  This should really only happen with
-		 * AST_SOFTHANGUP_ASYNCGOTO.
-		 */
-		ast_channel_lock(chan);
-		if (ast_channel_softhangup_internal_flag(chan) & AST_SOFTHANGUP_ASYNCGOTO) {
-			ast_set_flag(ast_channel_flags(chan), AST_FLAG_BRIDGE_HANGUP_DONT);
-			res = 0;
-		}
-		ast_channel_unlock(chan);
-		break;
-	default:
-		break;
-	}
+	ast_channel_lock(chan);
+	if (ast_channel_softhangup_internal_flag(chan) & AST_SOFTHANGUP_ASYNCGOTO) {
+		ast_set_flag(ast_channel_flags(chan), AST_FLAG_BRIDGE_HANGUP_DONT);
+		res = 0;
+	}
+	ast_channel_unlock(chan);
 
 	/* Wait for peer thread to exit bridge and die. */
 	if (!ast_autoservice_start(chan)) {




More information about the svn-commits mailing list