[asterisk-commits] bbryant: branch 1.8 r295670 - /branches/1.8/apps/app_queue.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Nov 19 15:40:27 CST 2010
Author: bbryant
Date: Fri Nov 19 15:40:21 2010
New Revision: 295670
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=295670
Log:
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:
branches/1.8/apps/app_queue.c
Modified: branches/1.8/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_queue.c?view=diff&rev=295670&r1=295669&r2=295670
==============================================================================
--- branches/1.8/apps/app_queue.c (original)
+++ branches/1.8/apps/app_queue.c Fri Nov 19 15:40:21 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 asterisk-commits
mailing list