[asterisk-commits] rmudgett: trunk r397651 - in /trunk: ./ include/asterisk/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Aug 26 11:25:41 CDT 2013


Author: rmudgett
Date: Mon Aug 26 11:25:39 2013
New Revision: 397651

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=397651
Log:
bridging: Fix a livelock with local channel optimization.

Use a better means of waking up the bridge channel thread.
........

Merged revisions 397650 from http://svn.asterisk.org/svn/asterisk/branches/12

Modified:
    trunk/   (props changed)
    trunk/include/asterisk/bridge_channel.h
    trunk/main/bridge_channel.c

Propchange: trunk/
------------------------------------------------------------------------------
--- branch-12-merged (original)
+++ branch-12-merged Mon Aug 26 11:25:39 2013
@@ -1,1 +1,1 @@
-/branches/12:1-397614,397621,397628,397630,397643
+/branches/12:1-397614,397621,397628,397630,397643,397650

Modified: trunk/include/asterisk/bridge_channel.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/bridge_channel.h?view=diff&rev=397651&r1=397650&r2=397651
==============================================================================
--- trunk/include/asterisk/bridge_channel.h (original)
+++ trunk/include/asterisk/bridge_channel.h Mon Aug 26 11:25:39 2013
@@ -144,8 +144,6 @@
 	AST_LIST_HEAD_NOLOCK(, ast_frame) wr_queue;
 	/*! Pipe to alert thread when frames are put into the wr_queue. */
 	int alert_pipe[2];
-	/*! TRUE if the bridge channel thread is waiting on channels (needs to be atomically settable) */
-	int waiting;
 	/*!
 	 * \brief The bridge channel thread activity.
 	 *

Modified: trunk/main/bridge_channel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/bridge_channel.c?view=diff&rev=397651&r1=397650&r2=397651
==============================================================================
--- trunk/main/bridge_channel.c (original)
+++ trunk/main/bridge_channel.c Mon Aug 26 11:25:39 2013
@@ -110,10 +110,8 @@
 static void bridge_channel_poke(struct ast_bridge_channel *bridge_channel)
 {
 	if (!pthread_equal(pthread_self(), bridge_channel->thread)) {
-		while (bridge_channel->waiting) {
-			pthread_kill(bridge_channel->thread, SIGURG);
-			sched_yield();
-		}
+		/* Wake up the bridge channel thread. */
+		ast_queue_frame(bridge_channel->chan, &ast_null_frame);
 	}
 }
 
@@ -1883,13 +1881,11 @@
 		ast_debug(10, "Bridge %s: %p(%s) is going into a waitfor\n",
 			bridge_channel->bridge->uniqueid, bridge_channel,
 			ast_channel_name(bridge_channel->chan));
-		bridge_channel->waiting = 1;
 		ast_bridge_channel_unlock(bridge_channel);
 		outfd = -1;
 		ms = bridge_channel_next_interval(bridge_channel);
 		chan = ast_waitfor_nandfds(&bridge_channel->chan, 1,
 			&bridge_channel->alert_pipe[0], 1, NULL, &outfd, &ms);
-		bridge_channel->waiting = 0;
 		if (ast_channel_softhangup_internal_flag(bridge_channel->chan) & AST_SOFTHANGUP_UNBRIDGE) {
 			ast_channel_clear_softhangup(bridge_channel->chan, AST_SOFTHANGUP_UNBRIDGE);
 			ast_bridge_channel_lock_bridge(bridge_channel);




More information about the asterisk-commits mailing list