From: Richard Mudgett Date: Fri, 30 Mar 2012 21:26:47 +0000 (+0000) Subject: Fix logger deadlock on Asterisk shutdown. X-Git-Tag: 1.8.12.0-rc1~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1df90a2cf1cc571f100ac518c3f01b91d00336b0;p=thirdparty%2Fasterisk.git 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 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@360933 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/logger.c b/main/logger.c index a701a832c9..d01e96ee8d 100644 --- a/main/logger.c +++ b/main/logger.c @@ -1062,6 +1062,7 @@ static void *logger_thread(void *data) 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); @@ -1179,8 +1180,6 @@ void close_logger(void) closelog(); /* syslog */ AST_RWLIST_UNLOCK(&logchannels); - - return; } /*! @@ -1267,15 +1266,18 @@ void ast_log(int level, const char *file, int line, const char *function, const /* 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); ast_free(logmsg); } - - return; } #ifdef HAVE_BKTR