diff options
author | Joshua Colp <jcolp@digium.com> | 2007-06-11 14:35:02 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2007-06-11 14:35:02 +0000 |
commit | eb56cb6b920a24d41d660c2ebaaf6884825b6e68 (patch) | |
tree | 433eee490440f03979a07a1390d3162bb0e65d0e /main/channel.c | |
parent | 21f50788435fa973c549b4a8a316ef9cce1bd3f3 (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
Diffstat (limited to 'main/channel.c')
-rw-r--r-- | main/channel.c | 23 |
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; } |