diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2013-05-15 07:45:33 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2013-05-15 07:45:33 +0200 |
commit | 1f2b6f1a9b110fec5995582285f0fe9dcd628c99 (patch) | |
tree | 21272f4304e8ee84ab691cde94cbe9dd514a1136 | |
parent | 2f958c6f55c77ba88fca49e73fea6be5ad9d7d8a (diff) | |
download | rsyslog-1f2b6f1a9b110fec5995582285f0fe9dcd628c99.tar.gz rsyslog-1f2b6f1a9b110fec5995582285f0fe9dcd628c99.tar.bz2 rsyslog-1f2b6f1a9b110fec5995582285f0fe9dcd628c99.zip |
bugfix: potential hang *in debug mode* on rsyslogd termination
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | runtime/debug.c | 17 |
2 files changed, 15 insertions, 7 deletions
@@ -1,4 +1,9 @@ --------------------------------------------------------------------------- +Version 7.3.16 [beta] 2013-05-?? +- bugfix: potential hang *in debug mode* on rsyslogd termination + This ONLY affected rsyslogd if it were running with debug output + enabled. +--------------------------------------------------------------------------- Version 7.3.15 [beta] 2013-05-15 - bugfix: problem in build system (especially when cross-compiling) Thanks to Tomas Heinrich and winfried_mb2@xmsnet.nl for the patch. diff --git a/runtime/debug.c b/runtime/debug.c index 876f61d0..68474989 100644 --- a/runtime/debug.c +++ b/runtime/debug.c @@ -1430,6 +1430,7 @@ dbgSetDebugFile(uchar *fn) rsRetVal dbgClassInit(void) { + pthread_mutexattr_t mutAttr; rsRetVal iRet; /* do not use DEFiRet, as this makes calls into the debug system! */ struct sigaction sigAct; @@ -1437,14 +1438,16 @@ rsRetVal dbgClassInit(void) (void) pthread_key_create(&keyCallStack, dbgCallStackDestruct); /* MUST be the first action done! */ - /* we initialize all Mutexes with code, as some platforms seem to have - * bugs in the static initializer macros. So better be on the safe side... - * rgerhards, 2008-03-06 + /* the mutexes must be recursive, because it may be called from within + * signal handlers, which can lead to a hang if the signal interrupted dbgprintf + * (yes, we have really seen that situation in practice!). -- rgerhards, 2013-05-17 */ - pthread_mutex_init(&mutFuncDBList, NULL); - pthread_mutex_init(&mutMutLog, NULL); - pthread_mutex_init(&mutCallStack, NULL); - pthread_mutex_init(&mutdbgprint, NULL); + pthread_mutexattr_init(&mutAttr); + pthread_mutexattr_settype(&mutAttr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutFuncDBList, &mutAttr); + pthread_mutex_init(&mutMutLog, &mutAttr); + pthread_mutex_init(&mutCallStack, &mutAttr); + pthread_mutex_init(&mutdbgprint, &mutAttr); /* while we try not to use any of the real rsyslog code (to avoid infinite loops), we * need to have the ability to query object names. Thus, we need to obtain a pointer to |