[asterisk-commits] rmudgett: trunk r360935 - in /trunk: ./ main/logger.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Mar 30 16:38:27 CDT 2012


Author: rmudgett
Date: Fri Mar 30 16:38:16 2012
New Revision: 360935

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=360935
Log:
Fix logger deadlock on Asterisk shutdown.

The logger_thread() had an exit path that failed to release the logmsgs
list lock.

* Make logger_thread() exit path unlock the logmsgs list lock.

* Made ast_log() not queue any messages to the logmsgs list if the
close_logger_thread flag is set.

(issue ASTERISK-19463)
Reported by: Matt Jordan
........

Merged revisions 360933 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 360934 from http://svn.asterisk.org/svn/asterisk/branches/10

Modified:
    trunk/   (props changed)
    trunk/main/logger.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-10-merged' - no diff available.

Modified: trunk/main/logger.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/logger.c?view=diff&rev=360935&r1=360934&r2=360935
==============================================================================
--- trunk/main/logger.c (original)
+++ trunk/main/logger.c Fri Mar 30 16:38:16 2012
@@ -1116,6 +1116,7 @@
 		AST_LIST_LOCK(&logmsgs);
 		if (AST_LIST_EMPTY(&logmsgs)) {
 			if (close_logger_thread) {
+				AST_LIST_UNLOCK(&logmsgs);
 				break;
 			} else {
 				ast_cond_wait(&logcond, &logmsgs.lock);
@@ -1233,8 +1234,6 @@
 	closelog(); /* syslog */
 
 	AST_RWLIST_UNLOCK(&logchannels);
-
-	return;
 }
 
 struct ast_callid *ast_create_callid(void)
@@ -1379,15 +1378,18 @@
 	/* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
 	if (logthread != AST_PTHREADT_NULL) {
 		AST_LIST_LOCK(&logmsgs);
-		AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
-		ast_cond_signal(&logcond);
+		if (close_logger_thread) {
+			/* Logger is either closing or closed.  We cannot log this message. */
+			ast_free(logmsg);
+		} else {
+			AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
+			ast_cond_signal(&logcond);
+		}
 		AST_LIST_UNLOCK(&logmsgs);
 	} else {
 		logger_print_normal(logmsg);
 		logmsg_free(logmsg);
 	}
-
-	return;
 }
 
 void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)




More information about the asterisk-commits mailing list