[asterisk-commits] file: branch 1.2 r68682 - /branches/1.2/channel.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Mon Jun 11 07:29:58 MST 2007


Author: file
Date: Mon Jun 11 09:29:58 2007
New Revision: 68682

URL: http://svn.digium.com/view/asterisk?view=rev&rev=68682
Log:
Improve deadlock handling of the channel list. (issue #8376 reported by one47)

Modified:
    branches/1.2/channel.c

Modified: branches/1.2/channel.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channel.c?view=diff&rev=68682&r1=68681&r2=68682
==============================================================================
--- branches/1.2/channel.c (original)
+++ branches/1.2/channel.c Mon Jun 11 09:29:58 2007
@@ -771,19 +771,29 @@
 		/* exit if chan not found or mutex acquired successfully */
 		done = (c == NULL) || (ast_mutex_trylock(&c->lock) == 0);
 		/* this is slightly unsafe, as we _should_ hold the lock to access c->name */
-		if (!done && c)
+		if (!done && c) {
 			ast_log(LOG_DEBUG, "Avoiding %s for '%s'\n", msg, c->name);
+			if (retries == 9) {
+				/* We are about to fail due to a deadlock, so report this
+				 * while we still have the list lock.
+				 */
+				ast_log(LOG_WARNING, "Avoided %s for '%p', %d retries!\n", msg, 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_mutex_unlock(&chlock);
 		if (done)
 			return c;
 		usleep(1);
 	}
-	/*
- 	 * c is surely not null, but we don't have the lock so cannot
-	 * access c->name
-	 */
-	ast_log(LOG_WARNING, "Avoided %s for '%p', %d retries!\n",
-		msg, c, retries);
 
 	return NULL;
 }



More information about the asterisk-commits mailing list