summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2007-06-11 14:35:02 +0000
committerJoshua Colp <jcolp@digium.com>2007-06-11 14:35:02 +0000
commiteb56cb6b920a24d41d660c2ebaaf6884825b6e68 (patch)
tree433eee490440f03979a07a1390d3162bb0e65d0e
parent21f50788435fa973c549b4a8a316ef9cce1bd3f3 (diff)
Merged revisions 68683 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r68683 | file | 2007-06-11 10:33:12 -0400 (Mon, 11 Jun 2007) | 10 lines Merged revisions 68682 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r68682 | file | 2007-06-11 10:29:58 -0400 (Mon, 11 Jun 2007) | 2 lines Improve deadlock handling of the channel list. (issue #8376 reported by one47) ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@68684 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--main/channel.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/main/channel.c b/main/channel.c
index 4d329d4c4..bb2457fff 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -977,19 +977,28 @@ static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
if (!done) {
if (option_debug)
ast_log(LOG_DEBUG, "Avoiding %s for channel '%p'\n", msg, c);
+ if (retries == 9) {
+ /* We are about to fail due to a deadlock, so report this
+ * while we still have the list lock.
+ */
+ if (option_debug)
+ ast_log(LOG_DEBUG, "Failure, could not lock '%p' after %d retries!\n", c, retries);
+ /* As we have deadlocked, we will skip this channel and
+ * see if there is another match.
+ * NOTE: No point doing this for a full-name match,
+ * as there can be no more matches.
+ */
+ if (!(name && !namelen)) {
+ prev = c;
+ retries = -1;
+ }
+ }
}
AST_LIST_UNLOCK(&channels);
if (done)
return c;
usleep(1); /* give other threads a chance before retrying */
}
- /*
- * c is surely not null, but we don't have the lock so cannot
- * access c->name
- */
- if (option_debug)
- ast_log(LOG_DEBUG, "Failure, could not lock '%p' after %d retries!\n",
- c, retries);
return NULL;
}