[asterisk-commits] mmichelson: branch mmichelson/issue13220 r182959 - /team/mmichelson/issue1322...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Mar 18 14:10:46 CDT 2009


Author: mmichelson
Date: Wed Mar 18 14:10:43 2009
New Revision: 182959

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=182959
Log:
Remove locking from num_available_members so that callers can handle the locking themselves.


Modified:
    team/mmichelson/issue13220/apps/app_queue.c

Modified: team/mmichelson/issue13220/apps/app_queue.c
URL: http://svn.digium.com/svn-view/asterisk/team/mmichelson/issue13220/apps/app_queue.c?view=diff&rev=182959&r1=182958&r2=182959
==============================================================================
--- team/mmichelson/issue13220/apps/app_queue.c (original)
+++ team/mmichelson/issue13220/apps/app_queue.c Wed Mar 18 14:10:43 2009
@@ -1717,15 +1717,14 @@
 	}
 }
 
+/* We assume that q is locked prior to this call */
 static int num_available_members(struct call_queue *q)
 {
 	struct member *mem;
 	int avl = 0;
 	struct ao2_iterator mem_iter;
 
-	ast_mutex_lock(&q->lock);
-
-	if (q->strategy == QUEUE_STRATEGY_RINGALL) {
+	if (!q->autofill || q->strategy == QUEUE_STRATEGY_RINGALL) {
 		ast_mutex_unlock(&q->lock);
 		return 1;
 	}
@@ -1746,7 +1745,6 @@
 		ao2_ref(mem, -1);
 	}
 
-	ast_mutex_unlock(&q->lock);
 	return avl;
 }
 
@@ -2383,54 +2381,38 @@
 {
 	struct queue_ent *ch;
 	int res;
-
-	if (!qe->parent->autofill) {
-		/* Atomically read the parent head -- does not need a lock */
-		ch = qe->parent->head;
-		/* If we are now at the top of the head, break out */
-		if (ch == qe) {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "It's our turn (%s).\n", qe->chan->name);
-			res = 1;
-		} else {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "It's not our turn (%s).\n", qe->chan->name);
-			res = 0;
-		}	
-
+	int avl;
+	int idx = 0;
+	/* This needs a lock. How many members are available to be served? */
+	ast_mutex_lock(&qe->parent->lock);
+
+	avl = num_available_members(qe->parent);
+		
+	ch = qe->parent->head;
+
+	if (option_debug) {
+		ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
+	}
+
+	while ((idx < avl) && (ch) && (ch != qe)) {
+		if (!ch->pending)
+			idx++;
+		ch = ch->next;			
+	}
+
+	ast_mutex_unlock(&qe->parent->lock);
+
+	/* If the queue entry is within avl [the number of available members] calls from the top ... */
+	if (ch && idx < avl) {
+		if (option_debug)
+			ast_log(LOG_DEBUG, "It's our turn (%s).\n", qe->chan->name);
+		res = 1;
 	} else {
-		int avl = num_available_members(qe->parent);
-		int idx = 0;
-		/* This needs a lock. How many members are available to be served? */
-		ast_mutex_lock(&qe->parent->lock);
-			
-		ch = qe->parent->head;
-
-		if (option_debug) {
-			ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
-		}
+		if (option_debug)
+			ast_log(LOG_DEBUG, "It's not our turn (%s).\n", qe->chan->name);
+		res = 0;
+	}
 	
-		while ((idx < avl) && (ch) && (ch != qe)) {
-			if (!ch->pending)
-				idx++;
-			ch = ch->next;			
-		}
-
-		ast_mutex_unlock(&qe->parent->lock);
-	
-		/* If the queue entry is within avl [the number of available members] calls from the top ... */
-		if (ch && idx < avl) {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "It's our turn (%s).\n", qe->chan->name);
-			res = 1;
-		} else {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "It's not our turn (%s).\n", qe->chan->name);
-			res = 0;
-		}
-		
-	}
-
 	return res;
 }
 /*! \brief The waiting areas for callers who are not actively calling members




More information about the asterisk-commits mailing list