dect
/
asterisk
Archived
13
0
Fork 0

Merged revisions 103120 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r103120 | mmichelson | 2008-02-08 12:48:17 -0600 (Fri, 08 Feb 2008) | 10 lines

Prevent a potential three-thread deadlock. Also added a comment block
to explicitly state the locking order necessary inside app_queue.

(closes issue #11862)
Reported by: flujan
Patches:
      11862.patch uploaded by putnopvut (license 60)
	  Tested by: flujan


........


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@103121 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
mmichelson 2008-02-08 18:54:53 +00:00
parent bbdabecaff
commit fe9a94030a
1 changed files with 20 additions and 5 deletions

View File

@ -93,6 +93,20 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/strings.h"
#include "asterisk/global_datastores.h"
/* Please read before modifying this file.
* There are three locks which are regularly used
* throughout this file, the queue list lock, the lock
* for each individual queue, and the interface list lock.
* Please be extra careful to always lock in the following order
* 1) queue list lock
* 2) individual queue lock
* 3) interface list lock
* This order has sort of "evolved" over the lifetime of this
* application, but it is now in place this way, so please adhere
* to this order!
*/
enum {
QUEUE_STRATEGY_RINGALL = 0,
QUEUE_STRATEGY_LEASTRECENT,
@ -1007,14 +1021,15 @@ static int remove_from_interfaces(const char *interface)
{
struct member_interface *curint;
if (interface_exists_global(interface))
return 0;
AST_LIST_LOCK(&interfaces);
AST_LIST_TRAVERSE_SAFE_BEGIN(&interfaces, curint, list) {
if (!strcasecmp(curint->interface, interface)) {
if (!interface_exists_global(interface)) {
ast_debug(1, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
AST_LIST_REMOVE_CURRENT(list);
ast_free(curint);
}
ast_debug(1, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
AST_LIST_REMOVE_CURRENT(&interfaces, list);
ast_free(curint);
break;
}
}