[asterisk-commits] file: branch 1.4 r68683 - in /branches/1.4: ./
main/channel.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Mon Jun 11 07:33:13 MST 2007
Author: file
Date: Mon Jun 11 09:33:12 2007
New Revision: 68683
URL: http://svn.digium.com/view/asterisk?view=rev&rev=68683
Log:
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)
........
Modified:
branches/1.4/ (props changed)
branches/1.4/main/channel.c
Propchange: branches/1.4/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.
Modified: branches/1.4/main/channel.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/channel.c?view=diff&rev=68683&r1=68682&r2=68683
==============================================================================
--- branches/1.4/main/channel.c (original)
+++ branches/1.4/main/channel.c Mon Jun 11 09:33:12 2007
@@ -1070,21 +1070,31 @@
/* exit if chan not found or mutex acquired successfully */
/* this is slightly unsafe, as we _should_ hold the lock to access c->name */
done = c == NULL || ast_channel_trylock(c) == 0;
- if (!done)
+ 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;
}
More information about the asterisk-commits
mailing list