From 6060f2eaaaf40f8ac71c17f19b4efc09ef85b1fb Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 24 May 2012 14:31:27 -0400 Subject: [PATCH 1/4] Only ignore errors when there is an error reporting path can't report from thread free mutex unlock or implicit thread creation --- src/libCom/osi/os/default/osdMessageQueue.cpp | 17 +++++------------ src/libCom/osi/os/posix/osdMutex.c | 2 +- src/libCom/osi/os/posix/osdThread.c | 13 ++++--------- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index 2e5343bbc..5ef7a0938 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -160,8 +160,7 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo /* * See if message can be sent */ - if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK) - return -1; + epicsMutexMustLock(pmsg->mutex); if ((pmsg->numberOfSendersWaiting > 0) || (pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL))) { @@ -194,10 +193,7 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo else epicsEventWait(threadNode.evp->event); - if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){ - freeEventNode(threadNode.evp); - return -1; - } + epicsMutexMustLock(pmsg->mutex); if(!threadNode.eventSent) ellDelete(&pmsg->sendQueue, &threadNode.link); @@ -270,8 +266,8 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, /* * If there's a message on the queue, copy it */ - if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK) - return -1; + epicsMutexMustLock(pmsg->mutex); + myOutPtr = (char *)pmsg->outPtr; if ((myOutPtr != pmsg->inPtr) || pmsg->full) { @@ -341,10 +337,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, else epicsEventWait(threadNode.evp->event); - if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){ - freeEventNode(threadNode.evp); - return -1; - } + epicsMutexMustLock(pmsg->mutex); if(!threadNode.eventSent) ellDelete(&pmsg->receiveQueue, &threadNode.link); diff --git a/src/libCom/osi/os/posix/osdMutex.c b/src/libCom/osi/os/posix/osdMutex.c index ec1e7097c..44a3c4d6e 100644 --- a/src/libCom/osi/os/posix/osdMutex.c +++ b/src/libCom/osi/os/posix/osdMutex.c @@ -245,7 +245,7 @@ void epicsMutexOsdUnlock(struct epicsMutexOSD * pmutex) pmutex->owned = 0; pmutex->ownerTid = 0; status = pthread_cond_signal(&pmutex->waitToBeOwner); - checkStatus(status, "pthread_cond_signal epicsMutexOsdUnlock"); + checkStatusQuit(status, "pthread_cond_signal epicsMutexOsdUnlock", "epicsMutexOsdUnlock"); } status = pthread_mutex_unlock(&pmutex->lock); diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index e5ad7b601..02232c567 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -199,17 +199,13 @@ static void free_threadInfo(epicsThreadOSD *pthreadInfo) int status; status = mutexLock(&listLock); - checkStatus(status,"pthread_mutex_lock free_threadInfo"); - if(status) - return; + checkStatusQuit(status,"pthread_mutex_lock","free_threadInfo"); if(pthreadInfo->isOnThreadList) ellDelete(&pthreadList,&pthreadInfo->node); status = pthread_mutex_unlock(&listLock); - checkStatus(status,"pthread_mutex_unlock free_threadInfo"); + checkStatusQuit(status,"pthread_mutex_unlock","free_threadInfo"); epicsEventDestroy(pthreadInfo->suspendEvent); status = pthread_attr_destroy(&pthreadInfo->attr); - checkStatus(status,"pthread_attr_destroy free_threadInfo"); - if(status) - return; + checkStatusQuit(status,"pthread_attr_destroy","free_threadInfo"); free(pthreadInfo); } @@ -437,8 +433,7 @@ static epicsThreadOSD *createImplicit(void) tid = pthread_self(); sprintf(name, "non-EPICS_%d", (int)tid); pthreadInfo = create_threadInfo(name); - if(!pthreadInfo) - return NULL; + assert(pthreadInfo); pthreadInfo->tid = tid; pthreadInfo->osiPriority = 0; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) From 3333217f569826e030d6beade9edc2d4630dc124 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 24 May 2012 14:31:28 -0400 Subject: [PATCH 2/4] simplify --- src/libCom/osi/os/default/osdMessageQueue.cpp | 9 ++++----- src/libCom/osi/os/posix/osdThread.c | 6 +++--- src/libCom/ring/epicsRingBytes.c | 3 +-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index 5ef7a0938..2c4a2f728 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -135,15 +135,14 @@ getEventNode(epicsMessageQueueId pmsg) evp = reinterpret_cast < struct eventNode * > ( ellGet(&pmsg->eventFreeList) ); if (evp == NULL) { - epicsEventId eid = epicsEventCreate(epicsEventEmpty); evp = (struct eventNode *) calloc(1, sizeof(*evp)); - if(!evp || !eid) { + if(!evp) + return NULL; + evp->event = epicsEventCreate(epicsEventEmpty); + if(!evp->event) { free(evp); - if(eid) - epicsEventDestroy(eid); return NULL; } - evp->event = eid; } return evp; } diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 02232c567..79321048a 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -72,7 +72,7 @@ typedef struct epicsThreadOSD { int isFifoScheduled; int isOnThreadList; unsigned int osiPriority; - char *name; + char name[1]; } epicsThreadOSD; static pthread_key_t getpthreadInfo; @@ -151,7 +151,8 @@ static epicsThreadOSD * create_threadInfo(const char *name) { epicsThreadOSD *pthreadInfo; - pthreadInfo = calloc(1,sizeof(*pthreadInfo) + strlen(name)+1); + /* sizeof(epicsThreadOSD) includes one byte for the '\0' */ + pthreadInfo = calloc(1,sizeof(*pthreadInfo) + strlen(name)); if(!pthreadInfo) return NULL; pthreadInfo->suspendEvent = epicsEventCreate(epicsEventEmpty); @@ -159,7 +160,6 @@ static epicsThreadOSD * create_threadInfo(const char *name) free(pthreadInfo); return NULL; } - pthreadInfo->name = (char*)&pthreadInfo[1]; strcpy(pthreadInfo->name, name); return pthreadInfo; } diff --git a/src/libCom/ring/epicsRingBytes.c b/src/libCom/ring/epicsRingBytes.c index f116a838a..2c15ee8f1 100644 --- a/src/libCom/ring/epicsRingBytes.c +++ b/src/libCom/ring/epicsRingBytes.c @@ -33,7 +33,7 @@ typedef struct ringPvt { volatile int nextPut; volatile int nextGet; int size; - volatile char *buffer; + volatile char buffer[1]; /* actually larger */ }ringPvt; epicsShareFunc epicsRingBytesId epicsShareAPI epicsRingBytesCreate(int size) @@ -42,7 +42,6 @@ epicsShareFunc epicsRingBytesId epicsShareAPI epicsRingBytesCreate(int size) if(!pring) return NULL; pring->size = size + SLOP; - pring->buffer = (char*)&pring[1]; pring->nextGet = 0; pring->nextPut = 0; return((void *)pring); From 5d2e5b46e53bc596417108b03250b657bc41534e Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 24 May 2012 14:31:28 -0400 Subject: [PATCH 3/4] minor --- src/libCom/osi/os/posix/osdThread.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 79321048a..02cf46588 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -716,6 +716,7 @@ epicsShareFunc void epicsShareAPI epicsThreadShow(epicsThreadId showThread, unsi } status = pthread_mutex_unlock(&listLock); checkStatus(status,"pthread_mutex_unlock epicsThreadShowAll"); + if(status) return; if (!found) printf("Thread %#lx (%lu) not found.\n", (unsigned long)showThread, (unsigned long)showThread); } From 3e9bae45b9ddc6833da762fa0a576dbb62d1e660 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 24 May 2012 14:31:29 -0400 Subject: [PATCH 4/4] default MQ report event wait errors --- src/libCom/osi/os/default/osdMessageQueue.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index 2c4a2f728..76fbadc63 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -187,10 +187,11 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo epicsMutexUnlock(pmsg->mutex); + epicsEventStatus sts; if(haveTimeout) - epicsEventWaitWithTimeout(threadNode.evp->event, timeout); + sts=epicsEventWaitWithTimeout(threadNode.evp->event, timeout); else - epicsEventWait(threadNode.evp->event); + sts=epicsEventWait(threadNode.evp->event); epicsMutexMustLock(pmsg->mutex); @@ -200,7 +201,7 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo ellAdd(&pmsg->eventFreeList, &threadNode.evp->link); - if (pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL)) { + if ((pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL)) || sts!=epicsEventOK) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -331,10 +332,11 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, ellAdd(&pmsg->receiveQueue, &threadNode.link); epicsMutexUnlock(pmsg->mutex); + epicsEventStatus sts; if(haveTimeout) - epicsEventWaitWithTimeout(threadNode.evp->event, timeout); + sts=epicsEventWaitWithTimeout(threadNode.evp->event, timeout); else - epicsEventWait(threadNode.evp->event); + sts=epicsEventWait(threadNode.evp->event); epicsMutexMustLock(pmsg->mutex); @@ -344,7 +346,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, epicsMutexUnlock(pmsg->mutex); - if(threadNode.eventSent && (threadNode.size <= size)) + if(threadNode.eventSent && (threadNode.size <= size) && sts==epicsEventOK) return threadNode.size; return -1; }