bugfix: unitialized mutex was used in msg.c:getPRI
authorRainer Gerhards <rgerhards@adiscon.com>
Mon, 26 Jan 2009 21:30:55 +0000 (22:30 +0100)
committerRainer Gerhards <rgerhards@adiscon.com>
Mon, 26 Jan 2009 21:30:55 +0000 (22:30 +0100)
This was subtle, because getPRI is called as part of the debugging code
(always executed) in syslogd.c:logmsg.

runtime/msg.c
runtime/msg.h
tools/syslogd.c

index 2e2d41a..02a4cd8 100644 (file)
@@ -190,6 +190,7 @@ static void MsgPrepareEnqueueLockingCase(msg_t *pThis)
         * rgerhards, 2008-07-14
         */
        pthread_mutexattr_destroy(&pThis->mutAttr);
+       pThis->bDoLock = 1;
        ENDfunc
 }
 
@@ -199,14 +200,16 @@ static void MsgLockLockingCase(msg_t *pThis)
 {
        /* DEV debug only! dbgprintf("MsgLock(0x%lx)\n", (unsigned long) pThis); */
        assert(pThis != NULL);
-       pthread_mutex_lock(&pThis->mut);
+       if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
+               pthread_mutex_lock(&pThis->mut);
 }
 
 static void MsgUnlockLockingCase(msg_t *pThis)
 {
        /* DEV debug only! dbgprintf("MsgUnlock(0x%lx)\n", (unsigned long) pThis); */
        assert(pThis != NULL);
-       pthread_mutex_unlock(&pThis->mut);
+       if(pThis->bDoLock == 1) /* TODO: this is a testing hack, we should find a way with better performance! -- rgerhards, 2009-01-27 */
+               pthread_mutex_unlock(&pThis->mut);
 }
 
 /* delete the mutex object on message destruction (locking case)
@@ -745,6 +748,7 @@ char *getMSG(msg_t *pM)
 char *getPRI(msg_t *pM)
 {
        int pri;
+       BEGINfunc
 
        if(pM == NULL)
                return "";
@@ -764,6 +768,7 @@ char *getPRI(msg_t *pM)
        }
        MsgUnlock(pM);
 
+       ENDfunc
        return (char*)pM->pszPRI;
 }
 
index d98111a..c835062 100644 (file)
@@ -51,6 +51,7 @@
 struct msg {
        BEGINobjInstance;       /* Data to implement generic object - MUST be the first data element! */
        pthread_mutexattr_t mutAttr;
+short bDoLock; /* use the mutex? */
        pthread_mutex_t mut;
        flowControl_t flowCtlType; /**< type of flow control we can apply, for enqueueing, needs not to be persisted because
                                        once data has entered the queue, this property is no longer needed. */
index 2cac8fe..f0d6393 100644 (file)
@@ -2431,6 +2431,7 @@ init(void)
                ABORT_FINALIZE(RS_RET_VALIDATION_RUN);
 
        /* switch the message object to threaded operation, if necessary */
+/* TODO:XXX: I think we must do this also if we have action queues! -- rgerhards, 2009-01-26 */
        if(MainMsgQueType == QUEUETYPE_DIRECT || iMainMsgQueueNumWorkers > 1) {
                MsgEnableThreadSafety();
        }