[svn-commits] bbryant: trunk r295671 - in /trunk: ./ apps/app_queue.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Nov 19 15:42:16 CST 2010


Author: bbryant
Date: Fri Nov 19 15:42:10 2010
New Revision: 295671

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=295671
Log:
Merged revisions 295670 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r295670 | bbryant | 2010-11-19 16:40:21 -0500 (Fri, 19 Nov 2010) | 8 lines
  
  Patch for deadlock from ordering issue between channel/queue locks in app_queue
  (set_queue_variables).
  
  (closes issue #18031)
  Reported by: rain
  
  Review: https://reviewboard.asterisk.org/r/1018/
........

Modified:
    trunk/   (props changed)
    trunk/apps/app_queue.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_queue.c?view=diff&rev=295671&r1=295670&r2=295671
==============================================================================
--- trunk/apps/app_queue.c (original)
+++ trunk/apps/app_queue.c Fri Nov 19 15:42:10 2010
@@ -1134,6 +1134,8 @@
 	char interfacevar[256]="";
 	float sl = 0;
 
+	ao2_lock(q);
+
 	if (q->setqueuevar) {
 		sl = 0;
 		if (q->callscompleted > 0) 
@@ -1142,8 +1144,12 @@
 		snprintf(interfacevar, sizeof(interfacevar),
 			"QUEUENAME=%s,QUEUEMAX=%d,QUEUESTRATEGY=%s,QUEUECALLS=%d,QUEUEHOLDTIME=%d,QUEUETALKTIME=%d,QUEUECOMPLETED=%d,QUEUEABANDONED=%d,QUEUESRVLEVEL=%d,QUEUESRVLEVELPERF=%2.1f",
 			q->name, q->maxlen, int2strat(q->strategy), q->count, q->holdtime, q->talktime, q->callscompleted, q->callsabandoned,  q->servicelevel, sl);
+
+		ao2_unlock(q);
 	
 		pbx_builtin_setvar_multiple(chan, interfacevar); 
+	} else {
+		ao2_unlock(q);
 	}
 }
 
@@ -3173,8 +3179,8 @@
 /*! \brief Record that a caller gave up on waiting in queue */
 static void record_abandoned(struct queue_ent *qe)
 {
+	set_queue_variables(qe->parent, qe->chan);
 	ao2_lock(qe->parent);
-	set_queue_variables(qe->parent, qe->chan);
 	manager_event(EVENT_FLAG_AGENT, "QueueCallerAbandon",
 		"Queue: %s\r\n"
 		"Uniqueid: %s\r\n"
@@ -4096,9 +4102,7 @@
 	struct ast_channel *chan = qeb->chan;
 
 	if (ao2_ref(qeb, -1) == 1) {
-		ao2_lock(q);
 		set_queue_variables(q, chan);
-		ao2_unlock(q);
 		/* This unrefs the reference we made in try_calling when we allocated qeb */
 		queue_t_unref(q, "Expire bridge_config reference");
 	}
@@ -4568,10 +4572,11 @@
 			pbx_builtin_setvar_multiple(peer, interfacevar);
 		}
 	
+		ao2_unlock(qe->parent);
+
 		/* try to set queue variables if configured to do so*/
 		set_queue_variables(qe->parent, qe->chan);
 		set_queue_variables(qe->parent, peer);
-		ao2_unlock(qe->parent);
 		
 		ast_channel_lock(qe->chan);
 		if ((monitorfilename = pbx_builtin_getvar_helper(qe->chan, "MONITOR_FILENAME"))) {




More information about the svn-commits mailing list