diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-11-17 19:02:09 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-11-17 19:02:09 +0000 |
commit | 16535784570c5400c88d9cec6a62bb8a5ce01fde (patch) | |
tree | 00a77750c649aa59cd91f157fefdbfc96c937fb0 | |
parent | 2b1a8b77802c4f8b9c73a825480ea031132037f1 (diff) |
backport proper channel_find_locked behavior from 1.4 branch (noted by Steve Davies on asterisk-dev list)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@47802 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channel.c | 51 |
1 files changed, 21 insertions, 30 deletions
@@ -732,43 +732,34 @@ static struct ast_channel *channel_find_locked(const struct ast_channel *prev, const char *context, const char *exten) { const char *msg = prev ? "deadlock" : "initial deadlock"; - int retries, done; + int retries; struct ast_channel *c; for (retries = 0; retries < 10; retries++) { + int done; + ast_mutex_lock(&chlock); for (c = channels; c; c = c->next) { - if (!prev) { - /* want head of list */ - if (!name && !exten) - break; - if (name) { - /* want match by full name */ - if (!namelen) { - if (!strcasecmp(c->name, name)) - break; - else - continue; - } - /* want match by name prefix */ - if (!strncasecmp(c->name, name, namelen)) - break; - } else if (exten) { - /* want match by context and exten */ - if (context && (strcasecmp(c->context, context) && - strcasecmp(c->macrocontext, context))) - continue; - /* match by exten */ - if (strcasecmp(c->exten, exten) && - strcasecmp(c->macroexten, exten)) - continue; - else - break; - } - } else if (c == prev) { /* found, return c->next */ + if (prev) { /* look for next item */ + if (c != prev) /* not this one */ + continue; + /* found, prepare to return c->next */ c = c->next; - break; } + if (name) { /* want match by name */ + if ((!namelen && strcasecmp(c->name, name)) || + (namelen && strncasecmp(c->name, name, namelen))) + continue; /* name match failed */ + } else if (exten) { + if (context && strcasecmp(c->context, context) && + strcasecmp(c->macrocontext, context)) + continue; /* context match failed */ + if (strcasecmp(c->exten, exten) && + strcasecmp(c->macroexten, exten)) + continue; /* exten match failed */ + } + /* if we get here, c points to the desired record */ + break; } /* exit if chan not found or mutex acquired successfully */ done = (c == NULL) || (ast_mutex_trylock(&c->lock) == 0); |