[svn-commits] rmudgett: branch rmudgett/bridge_phase r381507 - in /team/rmudgett/bridge_pha...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Feb 14 15:26:02 CST 2013


Author: rmudgett
Date: Thu Feb 14 15:25:59 2013
New Revision: 381507

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=381507
Log:
* Add missing call to ast_bridge_features_destroy() in
ast_bridge_impart().

* Moved debug messages around to reduce bridge locking time in
bridge_thread().

* Increased debug level on spamming message in
bridge_channel_join_multithreaded().

* Comment updates.

Modified:
    team/rmudgett/bridge_phase/include/asterisk/bridging.h
    team/rmudgett/bridge_phase/include/asterisk/bridging_technology.h
    team/rmudgett/bridge_phase/main/bridging.c
    team/rmudgett/bridge_phase/main/pbx.c

Modified: team/rmudgett/bridge_phase/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/include/asterisk/bridging.h?view=diff&rev=381507&r1=381506&r2=381507
==============================================================================
--- team/rmudgett/bridge_phase/include/asterisk/bridging.h (original)
+++ team/rmudgett/bridge_phase/include/asterisk/bridging.h Thu Feb 14 15:25:59 2013
@@ -230,11 +230,11 @@
 	 * for bridge technologies that mix audio. When set to 0, the bridge tech must choose a
 	 * default interval for itself. */
 	unsigned int internal_mixing_interval;
-	/*! Bit to indicate that the bridge thread is waiting on channels in the bridge array */
+	/*! TRUE if the bridge thread is waiting on channels in the bridge array */
 	unsigned int waiting:1;
-	/*! Bit to indicate the bridge thread should stop */
+	/*! TRUE if the bridge thread should stop */
 	unsigned int stop:1;
-	/*! Bit to indicate the bridge thread should refresh itself */
+	/*! TRUE if the bridge thread should refresh itself */
 	unsigned int refresh:1;
 	/*! Bridge flags to tweak behavior */
 	struct ast_flags feature_flags;

Modified: team/rmudgett/bridge_phase/include/asterisk/bridging_technology.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/include/asterisk/bridging_technology.h?view=diff&rev=381507&r1=381506&r2=381507
==============================================================================
--- team/rmudgett/bridge_phase/include/asterisk/bridging_technology.h (original)
+++ team/rmudgett/bridge_phase/include/asterisk/bridging_technology.h Thu Feb 14 15:25:59 2013
@@ -73,7 +73,7 @@
 	int (*poke)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);
 	/*! Formats that the bridge technology supports */
 	struct ast_format_cap *format_capabilities;
-	/*! Bit to indicate whether the bridge technology is currently suspended or not */
+	/*! TRUE if the bridge technology is currently suspended. */
 	unsigned int suspended:1;
 	/*! Module this bridge technology belongs to. Is used for reference counting when creating/destroying a bridge. */
 	struct ast_module *mod;

Modified: team/rmudgett/bridge_phase/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/main/bridging.c?view=diff&rev=381507&r1=381506&r2=381507
==============================================================================
--- team/rmudgett/bridge_phase/main/bridging.c (original)
+++ team/rmudgett/bridge_phase/main/bridging.c Thu Feb 14 15:25:59 2013
@@ -135,6 +135,7 @@
 /*! \note This function assumes the bridge_channel is locked. */
 static void ast_bridge_change_state_nolock(struct ast_bridge_channel *bridge_channel, enum ast_bridge_channel_state new_state)
 {
+/* BUGBUG need cause code for the bridge_channel leaving the bridge. */
 	ast_debug(1, "BUGBUG Setting bridge channel %p state from:%d to:%d\n",
 		bridge_channel, bridge_channel->state, new_state);
 
@@ -307,6 +308,7 @@
 {
 	struct ast_bridge_channel *bridge_channel;
 
+/* BUGBUG need a cause code on the bridge for the later ejected channels. */
 	AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
 		ao2_lock(bridge_channel);
 		switch (bridge_channel->state) {
@@ -320,7 +322,18 @@
 	}
 }
 
-/*! \brief Internal function to see whether a bridge should dissolve, and if so do it */
+/*!
+ * \internal
+ * \brief Check if a bridge should dissolve and then do it.
+ * \since 12.0.0
+ *
+ * \param bridge Bridge to check.
+ * \param bridge_channel Channel causing the check.
+ *
+ * \note On entry, bridge is already locked.
+ *
+ * \return Nothing
+ */
 static void bridge_check_dissolve(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 {
 	if (!ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_DISSOLVE_HANGUP)
@@ -554,13 +567,13 @@
 	struct ast_bridge *bridge = data;
 	int res = 0;
 
+	ast_debug(1, "Started bridge thread for %p\n", bridge);
+
 	ao2_lock(bridge);
 
 	if (bridge->callid) {
 		ast_callid_threadassoc_add(bridge->callid);
 	}
-
-	ast_debug(1, "Started bridge thread for %p\n", bridge);
 
 	/* Loop around until we are told to stop */
 	while (!bridge->stop) {
@@ -572,10 +585,6 @@
 
 		/* In case the refresh bit was set simply set it back to off */
 		bridge->refresh = 0;
-
-		ast_debug(1, "Launching bridge thread function %p for bridge %p\n",
-			bridge->technology->thread ? bridge->technology->thread : generic_thread_loop,
-			bridge);
 
 		/*
 		 * Execute the appropriate thread function.  If the technology
@@ -595,10 +604,9 @@
 		}
 	}
 
+	ao2_unlock(bridge);
+
 	ast_debug(1, "Ending bridge thread for %p\n", bridge);
-
-	ao2_unlock(bridge);
-	ao2_ref(bridge, -1);
 
 	return NULL;
 }
@@ -994,7 +1002,7 @@
 		ao2_unlock(bridge_channel);
 		ao2_lock(bridge_channel->bridge);
 	} else if (bridge_channel->suspended) {
-		ast_debug(10, "Going into a multithreaded signal wait for bridge channel %p of bridge %p\n",
+		ast_debug(1, "Going into a multithreaded signal wait for bridge channel %p of bridge %p\n",
 			bridge_channel, bridge_channel->bridge);
 		ast_cond_wait(&bridge_channel->cond, ao2_object_get_lockaddr(bridge_channel));
 		ao2_unlock(bridge_channel);
@@ -1017,7 +1025,8 @@
 	ao2_unlock(bridge_channel->bridge);
 	ao2_lock(bridge_channel);
 	if (bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
-		ast_debug(1, "Going into a single threaded signal wait for bridge channel %p of bridge %p\n", bridge_channel, bridge_channel->bridge);
+		ast_debug(1, "Going into a single threaded signal wait for bridge channel %p of bridge %p\n",
+			bridge_channel, bridge_channel->bridge);
 		ast_cond_wait(&bridge_channel->cond, ao2_object_get_lockaddr(bridge_channel));
 	}
 	ao2_unlock(bridge_channel);
@@ -1824,6 +1833,7 @@
 	ao2_ref(bridge_channel, -1);
 
 join_exit:;
+/* BUGBUG this is going to cause problems for DTMF atxfer attended bridge between B & C.  Maybe an ast_bridge_join_internal() that does not do the after bridge goto for this case. */
 	if (!(ast_channel_softhangup_internal_flag(chan) & AST_SOFTHANGUP_ASYNCGOTO)
 		&& !ast_after_bridge_goto_setup(chan)) {
 		/* Claim the after bridge goto is an async goto destination. */
@@ -1931,6 +1941,7 @@
 		/* cleanup */
 		bridge_channel->chan = NULL;
 		bridge_channel->swap = NULL;
+		ast_bridge_features_destroy(bridge_channel->features);
 		bridge_channel->features = NULL;
 
 		ao2_ref(bridge_channel, -1);

Modified: team/rmudgett/bridge_phase/main/pbx.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/main/pbx.c?view=diff&rev=381507&r1=381506&r2=381507
==============================================================================
--- team/rmudgett/bridge_phase/main/pbx.c (original)
+++ team/rmudgett/bridge_phase/main/pbx.c Thu Feb 14 15:25:59 2013
@@ -9528,6 +9528,7 @@
 		struct ast_format writeformat;
 	} tmpvars = { 0, };
 
+/* BUGBUG need to add bridge check code to also do an ast_explicit_goto() as a blind transfer. */
 	ast_channel_lock(chan);
 	if (ast_channel_pbx(chan)) { /* This channel is currently in the PBX */
 		ast_explicit_goto(chan, context, exten, priority + 1);




More information about the svn-commits mailing list