[svn-commits] file: branch file/bridging r127659 - /team/file/bridging/main/bridging.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Jul 2 18:39:26 CDT 2008


Author: file
Date: Wed Jul  2 18:39:25 2008
New Revision: 127659

URL: http://svn.digium.com/view/asterisk?view=rev&rev=127659
Log:
Some code clean up, plus get features going again.

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

Modified: team/file/bridging/main/bridging.c
URL: http://svn.digium.com/view/asterisk/team/file/bridging/main/bridging.c?view=diff&rev=127659&r1=127658&r2=127659
==============================================================================
--- team/file/bridging/main/bridging.c (original)
+++ team/file/bridging/main/bridging.c Wed Jul  2 18:39:25 2008
@@ -811,7 +811,7 @@
 	}
 
 	/* Actually execute the respective threading model, and keep our bridge thread alive */
-	while (state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
+	while (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
 		/* If the technology requires a thread and one is not running, start it up */
 		if (bridge_channel->bridge->thread == AST_PTHREADT_NULL && (bridge_channel->bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_THREAD)) {
 			bridge_channel->bridge->stop = 0;
@@ -827,7 +827,9 @@
 		state = (bridge_channel->bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_MULTITHREADED ? bridge_channel_join_multithreaded(bridge_channel) : bridge_channel_join_singlethreaded(bridge_channel));
 		/* Depending on the above state see what we need to do */
 		if (state == AST_BRIDGE_CHANNEL_STATE_FEATURE) {
+			bridge_array_remove(bridge_channel->bridge, bridge_channel->chan);
 			bridge_channel_feature(bridge_channel->bridge, bridge_channel);
+			bridge_array_add(bridge_channel->bridge, bridge_channel->chan);
 		}
 	}
 
@@ -1133,8 +1135,9 @@
 	struct ast_bridge_features_hook *hook = NULL;
 
 	/* Allocate new memory and setup it's various variables */
-	if (!(hook = ast_calloc(1, sizeof(*hook))))
+	if (!(hook = ast_calloc(1, sizeof(*hook)))) {
 		return -1;
+	}
 
 	ast_copy_string(hook->dtmf, dtmf, sizeof(hook->dtmf));
 	hook->callback = callback;
@@ -1158,8 +1161,9 @@
 	ast_stopstream(chan);
 
 	/* If the person hit a DTMF digit while the above played back stick it into the buffer */
-	if (res)
+	if (res) {
 		exten[0] = (char)res;
+	}
 
 	/* Drop to dialtone so they can enter the extension they want to transfer to */
 	res = ast_app_dtget(chan, context, exten, exten_len, 100, 1000);
@@ -1342,12 +1346,15 @@
 	}
 
 	/* Grab the callback for each feature */
-	if (feature == AST_BRIDGE_BUILTIN_BLINDTRANSFER)
+	if (feature == AST_BRIDGE_BUILTIN_BLINDTRANSFER) {
 		callback = feature_blind_transfer;
-	else if (feature == AST_BRIDGE_BUILTIN_ATTENDEDTRANSFER)
+	} else if (feature == AST_BRIDGE_BUILTIN_ATTENDEDTRANSFER) {
 		callback = feature_attended_transfer;
-	else if (feature == AST_BRIDGE_BUILTIN_HANGUP)
+	} else if (feature == AST_BRIDGE_BUILTIN_HANGUP) {
 		callback = feature_hangup;
+	} else {
+		return -1;
+	}
 
 	/* The rest is basically pretty easy. We create another hook using the built in feature's callback and DTMF, easy as pie. */
 	return ast_bridge_features_hook(features, dtmf, callback, NULL);
@@ -1376,8 +1383,9 @@
 	struct ast_bridge_features_hook *hook = NULL;
 
 	/* This is relatively simple, hooks are kept as a list on the features structure so we just pop them off and free them */
-	while ((hook = AST_LIST_REMOVE_HEAD(&features->hooks, entry)))
-		free(hook);
+	while ((hook = AST_LIST_REMOVE_HEAD(&features->hooks, entry))) {
+		ast_free(hook);
+	}
 
 	return 0;
 }
@@ -1385,6 +1393,8 @@
 int ast_bridge_dtmf_stream(struct ast_bridge *bridge, const char *dtmf, struct ast_channel *chan)
 {
 	struct ast_bridge_channel *bridge_channel = NULL;
+
+	ao2_lock(bridge);
 
 	AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
 		if (bridge_channel->chan == chan)
@@ -1393,5 +1403,7 @@
 		bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_DTMF);
 	}
 
-	return 0;
-}
+	ao2_unlock(bridge);
+
+	return 0;
+}




More information about the svn-commits mailing list