diff -Purp rsyslog-5.8.6/runtime/modules.c rsyslog-5.8.6.mod/runtime/modules.c --- rsyslog-5.8.6/runtime/modules.c 2011-10-21 11:53:02.000000000 +0200 +++ rsyslog-5.8.6.mod/runtime/modules.c 2011-11-25 19:14:34.491976989 +0100 @@ -74,6 +74,9 @@ DEFobjCurrIf(strgen) */ static pthread_mutex_t mutLoadUnload; +/* mutObjGlobalOp defined in obj.c */ +extern pthread_mutex_t mutObjGlobalOp; + static modInfo_t *pLoadedModules = NULL; /* list of currently-loaded modules */ static modInfo_t *pLoadedModulesLast = NULL; /* tail-pointer */ @@ -667,6 +670,9 @@ modUnlinkAndDestroy(modInfo_t **ppThis) pThis = *ppThis; assert(pThis != NULL); + /* acquire mutObjGlobalOp before &mutLoadUnload to prevent deadlocks */ + pthread_mutex_lock(&mutObjGlobalOp); + pthread_mutex_lock(&mutLoadUnload); /* first check if we are permitted to unload */ @@ -704,6 +710,10 @@ modUnlinkAndDestroy(modInfo_t **ppThis) finalize_it: pthread_mutex_unlock(&mutLoadUnload); + + /* release obj lock */ + pthread_mutex_unlock(&mutObjGlobalOp); + RETiRet; } @@ -779,6 +789,9 @@ Load(uchar *pModName) assert(pModName != NULL); dbgprintf("Requested to load module '%s'\n", pModName); + /* acquire mutObjGlobalOp before &mutLoadUnload to prevent deadlocks */ + pthread_mutex_lock(&mutObjGlobalOp); + pthread_mutex_lock(&mutLoadUnload); iModNameLen = strlen((char *) pModName); @@ -904,6 +917,10 @@ Load(uchar *pModName) finalize_it: pthread_mutex_unlock(&mutLoadUnload); + + /* release obj lock */ + pthread_mutex_unlock(&mutObjGlobalOp); + RETiRet; } diff -Purp rsyslog-5.8.6/runtime/obj.c rsyslog-5.8.6.mod/runtime/obj.c --- rsyslog-5.8.6/runtime/obj.c 2011-10-21 11:53:02.000000000 +0200 +++ rsyslog-5.8.6.mod/runtime/obj.c 2011-11-24 22:26:12.284684402 +0100 @@ -99,7 +99,7 @@ DEFobjCurrIf(module) DEFobjCurrIf(errmsg) DEFobjCurrIf(strm) static objInfo_t *arrObjInfo[OBJ_NUM_IDS]; /* array with object information pointers */ -static pthread_mutex_t mutObjGlobalOp; /* mutex to guard global operations of the object system */ +pthread_mutex_t mutObjGlobalOp; /* mutex to guard global operations of the object system */ /* cookies for serialized lines */