From 860a22a90baf0b0a052d62698dde3364b18ff1db Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:55 -0700 Subject: [PATCH 1/8] posix osdMutex don't use cantProceed --- src/libCom/osi/os/posix/osdMutex.c | 89 +++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/src/libCom/osi/os/posix/osdMutex.c b/src/libCom/osi/os/posix/osdMutex.c index 064b82fe3..b9e874b44 100644 --- a/src/libCom/osi/os/posix/osdMutex.c +++ b/src/libCom/osi/os/posix/osdMutex.c @@ -31,12 +31,6 @@ if((status)) { \ errlogPrintf("epicsMutex %s failed: error %s\n",(message),strerror((status)));} -#define checkStatusQuit(status,message,method) \ -if(status) { \ - errlogPrintf("epicsMutex %s failed: error %s\n",(message),strerror((status))); \ - cantProceed((method)); \ -} - static int mutexLock(pthread_mutex_t *id) { int status; @@ -70,9 +64,13 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { epicsMutexOSD *pmutex; int status; - pmutex = callocMustSucceed(1, sizeof(*pmutex), "epicsMutexOsdCreate"); + pmutex = calloc(1, sizeof(*pmutex)); + if(!pmutex) + goto fail; + status = pthread_mutexattr_init(&pmutex->mutexAttr); - checkStatusQuit(status,"pthread_mutexattr_init", "epicsMutexOsdCreate"); + if (status) + goto fail; #if defined _POSIX_THREAD_PRIO_INHERIT status = pthread_mutexattr_setprotocol(&pmutex->mutexAttr, @@ -85,8 +83,15 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { if (errVerbose) checkStatus(status, "pthread_mutexattr_settype"); status = pthread_mutex_init(&pmutex->lock, &pmutex->mutexAttr); - checkStatusQuit(status, "pthread_mutex_init", "epicsMutexOsdCreate"); + if (status) + goto dattr; return pmutex; + +dattr: + pthread_mutexattr_destroy(&pmutex->mutexAttr); +fail: + free(pmutex); + return NULL; } void epicsMutexOsdDestroy(struct epicsMutexOSD * pmutex) @@ -105,17 +110,19 @@ void epicsMutexOsdUnlock(struct epicsMutexOSD * pmutex) int status; status = pthread_mutex_unlock(&pmutex->lock); - checkStatusQuit(status, "pthread_mutex_unlock", "epicsMutexOsdUnlock"); + checkStatus(status, "pthread_mutex_unlock epicsMutexOsdUnlock"); } epicsMutexLockStatus epicsMutexOsdLock(struct epicsMutexOSD * pmutex) { int status; - if (!pmutex) return epicsMutexLockError; status = mutexLock(&pmutex->lock); if (status == EINVAL) return epicsMutexLockError; - checkStatusQuit(status, "pthread_mutex_lock", "epicsMutexOsdLock"); + if(status) { + errlogMessage("epicsMutex pthread_mutex_lock failed: error epicsMutexOsdLock\n"); + return epicsMutexLockError; + } return epicsMutexLockOK; } @@ -127,7 +134,10 @@ epicsMutexLockStatus epicsMutexOsdTryLock(struct epicsMutexOSD * pmutex) status = pthread_mutex_trylock(&pmutex->lock); if (status == EINVAL) return epicsMutexLockError; if (status == EBUSY) return epicsMutexLockTimeout; - checkStatusQuit(status, "pthread_mutex_lock", "epicsMutexOsdTryLock"); + if(status) { + errlogMessage("epicsMutex pthread_mutex_trylock failed: error epicsMutexOsdTryLock"); + return epicsMutexLockError; + } return epicsMutexLockOK; } @@ -153,9 +163,13 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { epicsMutexOSD *pmutex; int status; - pmutex = callocMustSucceed(1, sizeof(*pmutex), "epicsMutexOsdCreate"); + pmutex = calloc(1, sizeof(*pmutex)); + if(!pmutex) + return NULL; + status = pthread_mutexattr_init(&pmutex->mutexAttr); - checkStatusQuit(status, "pthread_mutexattr_init", "epicsMutexOsdCreate"); + if(status) + goto fail; #if defined _POSIX_THREAD_PRIO_INHERIT status = pthread_mutexattr_setprotocol( @@ -164,7 +178,8 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { #endif /*_POSIX_THREAD_PRIO_INHERIT*/ status = pthread_mutex_init(&pmutex->lock, &pmutex->mutexAttr); - checkStatusQuit(status, "pthread_mutex_init", "epicsMutexOsdCreate"); + if(status) + goto dattr; #if defined _POSIX_THREAD_PROCESS_SHARED status = pthread_condattr_init(&pmutex->condAttr); @@ -176,8 +191,18 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { #else status = pthread_cond_init(&pmutex->waitToBeOwner, 0); #endif /*_POSIX_THREAD_PROCESS_SHARED*/ - checkStatusQuit(status, "pthread_cond_init", "epicsMutexOsdCreate"); + if(status) + goto dmutex; + return pmutex; + +dmutex: + pthread_mutex_destroy(&pmutex->lock); +dattr: + pthread_mutexattr_destroy(&pmutex->mutexAttr); +fail: + free(pmutex); + return NULL; } void epicsMutexOsdDestroy(struct epicsMutexOSD * pmutex) @@ -201,12 +226,15 @@ void epicsMutexOsdUnlock(struct epicsMutexOSD * pmutex) int status; status = mutexLock(&pmutex->lock); - checkStatusQuit(status, "pthread_mutex_lock", "epicsMutexOsdUnlock"); + checkStatus(status, "pthread_mutex_lock epicsMutexOsdUnlock"); + if(status) + return; if ((pmutex->count <= 0) || (pmutex->ownerTid != pthread_self())) { + pthread_mutex_unlock(&pmutex->lock); + checkStatus(status, "pthread_mutex_unlock epicsMutexOsdUnlock"); errlogPrintf("epicsMutexOsdUnlock but caller is not owner\n"); - status = pthread_mutex_unlock(&pmutex->lock); - checkStatusQuit(status, "pthread_mutex_unlock", "epicsMutexOsdUnlock"); + cantProceed("epicsMutexOsdUnlock but caller is not owner"); return; } @@ -214,11 +242,12 @@ void epicsMutexOsdUnlock(struct epicsMutexOSD * pmutex) if (pmutex->count == 0) { pmutex->owned = 0; pmutex->ownerTid = 0; - pthread_cond_signal(&pmutex->waitToBeOwner); + status = pthread_cond_signal(&pmutex->waitToBeOwner); + checkStatus(status, "pthread_cond_signal epicsMutexOsdUnlock"); } status = pthread_mutex_unlock(&pmutex->lock); - checkStatusQuit(status, "pthread_mutex_unlock", "epicsMutexOsdUnlock"); + checkStatus(status, "pthread_mutex_unlock epicsMutexOsdUnlock"); } static int condWait(pthread_cond_t *condId, pthread_mutex_t *mutexId) @@ -239,7 +268,9 @@ epicsMutexLockStatus epicsMutexOsdLock(struct epicsMutexOSD * pmutex) if (!pmutex || !tid) return epicsMutexLockError; status = mutexLock(&pmutex->lock); if (status == EINVAL) return epicsMutexLockError; - checkStatusQuit(status, "pthread_mutex_lock", "epicsMutexOsdLock"); + checkStatus(status, "pthread_mutex_lock epicsMutexOsdLock"); + if(status) + return epicsMutexLockError; while (pmutex->owned && !pthread_equal(pmutex->ownerTid, tid)) condWait(&pmutex->waitToBeOwner, &pmutex->lock); @@ -248,7 +279,9 @@ epicsMutexLockStatus epicsMutexOsdLock(struct epicsMutexOSD * pmutex) pmutex->count++; status = pthread_mutex_unlock(&pmutex->lock); - checkStatusQuit(status, "pthread_mutex_unlock", "epicsMutexOsdLock"); + checkStatus(status, "pthread_mutex_unlock epicsMutexOsdLock"); + if(status) + return epicsMutexLockError; return epicsMutexLockOK; } @@ -260,7 +293,9 @@ epicsMutexLockStatus epicsMutexOsdTryLock(struct epicsMutexOSD * pmutex) status = mutexLock(&pmutex->lock); if (status == EINVAL) return epicsMutexLockError; - checkStatusQuit(status, "pthread_mutex_lock", "epicsMutexOsdTryLock"); + checkStatus(status, "pthread_mutex_lock epicsMutexOsdTryLock"); + if(status) + return epicsMutexLockError; if (!pmutex->owned || pthread_equal(pmutex->ownerTid, tid)) { pmutex->ownerTid = tid; @@ -272,7 +307,9 @@ epicsMutexLockStatus epicsMutexOsdTryLock(struct epicsMutexOSD * pmutex) } status = pthread_mutex_unlock(&pmutex->lock); - checkStatusQuit(status, "pthread_mutex_unlock", "epicsMutexOsdTryLock"); + checkStatus(status, "pthread_mutex_unlock epicsMutexOsdTryLock"); + if(status) + return epicsMutexLockError; return result; } From 333ac3a88edb8172cc23401e1e339e6b894cb12a Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:56 -0700 Subject: [PATCH 2/8] osdThread avoid cantProceed --- src/libCom/osi/os/posix/osdThread.c | 65 +++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index df0321ae2..e5ad7b601 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -151,9 +151,16 @@ static epicsThreadOSD * create_threadInfo(const char *name) { epicsThreadOSD *pthreadInfo; - pthreadInfo = callocMustSucceed(1,sizeof(*pthreadInfo),"create_threadInfo"); - pthreadInfo->suspendEvent = epicsEventMustCreate(epicsEventEmpty); - pthreadInfo->name = epicsStrDup(name); + pthreadInfo = calloc(1,sizeof(*pthreadInfo) + strlen(name)+1); + if(!pthreadInfo) + return NULL; + pthreadInfo->suspendEvent = epicsEventCreate(epicsEventEmpty); + if(!pthreadInfo->suspendEvent){ + free(pthreadInfo); + return NULL; + } + pthreadInfo->name = (char*)&pthreadInfo[1]; + strcpy(pthreadInfo->name, name); return pthreadInfo; } @@ -165,6 +172,8 @@ static epicsThreadOSD * init_threadInfo(const char *name, int status; pthreadInfo = create_threadInfo(name); + if(!pthreadInfo) + return NULL; pthreadInfo->createFunc = funptr; pthreadInfo->createArg = parm; status = pthread_attr_init(&pthreadInfo->attr); @@ -190,14 +199,17 @@ static void free_threadInfo(epicsThreadOSD *pthreadInfo) int status; status = mutexLock(&listLock); - checkStatusQuit(status,"pthread_mutex_lock","free_threadInfo"); + checkStatus(status,"pthread_mutex_lock free_threadInfo"); + if(status) + return; if(pthreadInfo->isOnThreadList) ellDelete(&pthreadList,&pthreadInfo->node); status = pthread_mutex_unlock(&listLock); - checkStatusQuit(status,"pthread_mutex_unlock","free_threadInfo"); + checkStatus(status,"pthread_mutex_unlock free_threadInfo"); epicsEventDestroy(pthreadInfo->suspendEvent); status = pthread_attr_destroy(&pthreadInfo->attr); - checkStatusQuit(status,"pthread_attr_destroy","free_threadInfo"); - free(pthreadInfo->name); + checkStatus(status,"pthread_attr_destroy free_threadInfo"); + if(status) + return; free(pthreadInfo); } @@ -246,6 +258,7 @@ static void once(void) if(errVerbose) fprintf(stderr,"task priorities are not implemented\n"); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ pthreadInfo = init_threadInfo("_main_",0,epicsThreadGetStackSize(epicsThreadStackSmall),0,0); + assert(pthreadInfo!=NULL); status = pthread_setspecific(getpthreadInfo,(void *)pthreadInfo); checkStatusOnceQuit(status,"pthread_setspecific","epicsThreadInit"); status = mutexLock(&listLock); @@ -424,6 +437,8 @@ static epicsThreadOSD *createImplicit(void) tid = pthread_self(); sprintf(name, "non-EPICS_%d", (int)tid); pthreadInfo = create_threadInfo(name); + if(!pthreadInfo) + return NULL; pthreadInfo->tid = tid; pthreadInfo->osiPriority = 0; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) @@ -437,7 +452,11 @@ static epicsThreadOSD *createImplicit(void) } #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ status = pthread_setspecific(getpthreadInfo,(void *)pthreadInfo); - checkStatusQuit(status,"pthread_setspecific","createImplicit"); + checkStatus(status,"pthread_setspecific createImplicit"); + if(status){ + free_threadInfo(pthreadInfo); + return NULL; + } /* pthread_cleanup_push(nonEPICSthreadCleanup, pthreadInfo); */ return pthreadInfo; } @@ -451,7 +470,7 @@ epicsShareFunc void epicsShareAPI epicsThreadSuspendSelf(void) if(pthreadInfo==NULL) pthreadInfo = createImplicit(); pthreadInfo->isSuspended = 1; - epicsEventMustWait(pthreadInfo->suspendEvent); + epicsEventWait(pthreadInfo->suspendEvent); } epicsShareFunc void epicsShareAPI epicsThreadResume(epicsThreadOSD *pthreadInfo) @@ -601,14 +620,16 @@ epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetId(const char *name) { assert(epicsThreadOnceCalled); status = mutexLock(&listLock); - checkStatusQuit(status,"pthread_mutex_lock","epicsThreadGetId"); + checkStatus(status,"pthread_mutex_lock epicsThreadGetId"); + if(status) + return NULL; pthreadInfo=(epicsThreadOSD *)ellFirst(&pthreadList); while(pthreadInfo) { if(strcmp(name,pthreadInfo->name) == 0) break; pthreadInfo=(epicsThreadOSD *)ellNext(&pthreadInfo->node); } status = pthread_mutex_unlock(&listLock); - checkStatusQuit(status,"pthread_mutex_unlock","epicsThreadGetId"); + checkStatus(status,"pthread_mutex_unlock epicsThreadGetId"); return(pthreadInfo); } @@ -662,14 +683,16 @@ epicsShareFunc void epicsShareAPI epicsThreadShowAll(unsigned int level) epicsThreadInit(); epicsThreadShow(0,level); status = mutexLock(&listLock); - checkStatusQuit(status,"pthread_mutex_lock","epicsThreadShowAll"); + checkStatus(status,"pthread_mutex_lock epicsThreadShowAll"); + if(status) + return; pthreadInfo=(epicsThreadOSD *)ellFirst(&pthreadList); while(pthreadInfo) { showThreadInfo(pthreadInfo,level); pthreadInfo=(epicsThreadOSD *)ellNext(&pthreadInfo->node); } status = pthread_mutex_unlock(&listLock); - checkStatusQuit(status,"pthread_mutex_unlock","epicsThreadShowAll"); + checkStatus(status,"pthread_mutex_unlock epicsThreadShowAll"); } epicsShareFunc void epicsShareAPI epicsThreadShow(epicsThreadId showThread, unsigned int level) @@ -684,7 +707,9 @@ epicsShareFunc void epicsShareAPI epicsThreadShow(epicsThreadId showThread, unsi return; } status = mutexLock(&listLock); - checkStatusQuit(status,"pthread_mutex_lock","epicsThreadShowAll"); + checkStatus(status,"pthread_mutex_lock epicsThreadShowAll"); + if(status) + return; pthreadInfo=(epicsThreadOSD *)ellFirst(&pthreadList); while(pthreadInfo) { if (((epicsThreadId)pthreadInfo == showThread) @@ -695,7 +720,7 @@ epicsShareFunc void epicsShareAPI epicsThreadShow(epicsThreadId showThread, unsi pthreadInfo=(epicsThreadOSD *)ellNext(&pthreadInfo->node); } status = pthread_mutex_unlock(&listLock); - checkStatusQuit(status,"pthread_mutex_unlock","epicsThreadShowAll"); + checkStatus(status,"pthread_mutex_unlock epicsThreadShowAll"); if (!found) printf("Thread %#lx (%lu) not found.\n", (unsigned long)showThread, (unsigned long)showThread); } @@ -707,9 +732,13 @@ epicsShareFunc epicsThreadPrivateId epicsShareAPI epicsThreadPrivateCreate(void) int status; epicsThreadInit(); - key = callocMustSucceed(1,sizeof(pthread_key_t),"epicsThreadPrivateCreate"); + key = calloc(1,sizeof(pthread_key_t)); + if(!key) + return NULL; status = pthread_key_create(key,0); - checkStatusQuit(status,"pthread_key_create","epicsThreadPrivateCreate"); + checkStatus(status,"pthread_key_create epicsThreadPrivateCreate"); + if(status) + return NULL; return((epicsThreadPrivateId)key); } @@ -748,6 +777,8 @@ epicsShareFunc double epicsShareAPI epicsThreadSleepQuantum () { double hz; hz = sysconf ( _SC_CLK_TCK ); + if(hz<0) + return 0.0; return 1.0 / hz; } From 294e66039e52f9a869066c7d9d6a0f1043e5976c Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:57 -0700 Subject: [PATCH 3/8] epicsRingBytes avoid cantProceed --- src/libCom/ring/epicsRingBytes.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libCom/ring/epicsRingBytes.c b/src/libCom/ring/epicsRingBytes.c index 4ab883fd7..f116a838a 100644 --- a/src/libCom/ring/epicsRingBytes.c +++ b/src/libCom/ring/epicsRingBytes.c @@ -19,7 +19,6 @@ #define epicsExportSharedSymbols #include "dbDefs.h" -#include "cantProceed.h" #include "epicsRingBytes.h" /* @@ -39,9 +38,11 @@ typedef struct ringPvt { epicsShareFunc epicsRingBytesId epicsShareAPI epicsRingBytesCreate(int size) { - ringPvt *pring = mallocMustSucceed(sizeof(ringPvt),"epicsRingBytesCreate"); + ringPvt *pring = malloc(sizeof(ringPvt) + size + SLOP); + if(!pring) + return NULL; pring->size = size + SLOP; - pring->buffer = mallocMustSucceed(pring->size,"ringCreate"); + pring->buffer = (char*)&pring[1]; pring->nextGet = 0; pring->nextPut = 0; return((void *)pring); @@ -50,7 +51,6 @@ epicsShareFunc epicsRingBytesId epicsShareAPI epicsRingBytesCreate(int size) epicsShareFunc void epicsShareAPI epicsRingBytesDelete(epicsRingBytesId id) { ringPvt *pring = (ringPvt *)id; - free((void *)pring->buffer); free((void *)pring); } From 34fc8f82512447faa6b2c8239a50eda9d32dd10c Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:57 -0700 Subject: [PATCH 4/8] rtems osdMessageQueue.c --- src/libCom/osi/os/RTEMS/osdMessageQueue.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libCom/osi/os/RTEMS/osdMessageQueue.c b/src/libCom/osi/os/RTEMS/osdMessageQueue.c index 2707df1f4..05c930d45 100644 --- a/src/libCom/osi/os/RTEMS/osdMessageQueue.c +++ b/src/libCom/osi/os/RTEMS/osdMessageQueue.c @@ -27,7 +27,6 @@ #include #include #include -#include #include "epicsMessageQueue.h" #include "errlog.h" @@ -35,11 +34,14 @@ epicsShareFunc epicsMessageQueueId epicsShareAPI epicsMessageQueueCreate(unsigned int capacity, unsigned int maximumMessageSize) { rtems_status_code sc; - epicsMessageQueueId id = (epicsMessageQueueId)callocMustSucceed(1, sizeof(*id), "epicsMessageQueueCreate"); + epicsMessageQueueId id = calloc(1, sizeof(*id)); rtems_interrupt_level level; static char c1 = 'a'; static char c2 = 'a'; static char c3 = 'a'; + + if(!id) + return NULL; sc = rtems_message_queue_create (rtems_build_name ('Q', c3, c2, c1), capacity, @@ -47,6 +49,7 @@ epicsMessageQueueCreate(unsigned int capacity, unsigned int maximumMessageSize) RTEMS_FIFO|RTEMS_LOCAL, &id->id); if (sc != RTEMS_SUCCESSFUL) { + free(id); errlogPrintf ("Can't create message queue: %s\n", rtems_status_text (sc)); return NULL; } From e41bd3994e612cd9aa39ca0eec72aad83f1b069f Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:58 -0700 Subject: [PATCH 5/8] default osdMessageQueue avoid cantProceed --- src/libCom/osi/os/default/osdMessageQueue.cpp | 87 ++++++++++++++++--- 1 file changed, 73 insertions(+), 14 deletions(-) diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index 83a5ba2ca..2e5343bbc 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -74,24 +74,46 @@ epicsShareFunc epicsMessageQueueId epicsShareAPI epicsMessageQueueCreate( epicsMessageQueueId pmsg; unsigned int slotBytes, slotLongs; - assert(capacity != 0); - pmsg = (epicsMessageQueueId)callocMustSucceed(1, sizeof(*pmsg), "epicsMessageQueueCreate"); + if(capacity == 0) + return NULL; + + pmsg = (epicsMessageQueueId)calloc(1, sizeof(*pmsg)); + if(!pmsg) + return NULL; + pmsg->capacity = capacity; pmsg->maxMessageSize = maxMessageSize; slotLongs = 1 + ((maxMessageSize + sizeof(unsigned long) - 1) / sizeof(unsigned long)); slotBytes = slotLongs * sizeof(unsigned long); - pmsg->buf = (unsigned long *)callocMustSucceed(pmsg->capacity, slotBytes, "epicsMessageQueueCreate"); + + pmsg->mutex = epicsMutexCreate(); + pmsg->buf = (unsigned long*)calloc(pmsg->capacity, slotBytes); + if(!pmsg->buf || !pmsg->mutex) { + if(pmsg->mutex) + epicsMutexDestroy(pmsg->mutex); + free(pmsg->buf); + free(pmsg); + return NULL; + } + pmsg->inPtr = pmsg->outPtr = pmsg->firstMessageSlot = (char *)&pmsg->buf[0]; pmsg->lastMessageSlot = (char *)&pmsg->buf[(capacity - 1) * slotLongs]; pmsg->full = false; pmsg->slotSize = slotBytes; - pmsg->mutex = epicsMutexMustCreate(); + ellInit(&pmsg->sendQueue); ellInit(&pmsg->receiveQueue); ellInit(&pmsg->eventFreeList); return pmsg; } +static void +freeEventNode(struct eventNode *enode) +{ + epicsEventDestroy(enode->event); + free(enode); +} + epicsShareFunc void epicsShareAPI epicsMessageQueueDestroy(epicsMessageQueueId pmsg) { @@ -99,8 +121,7 @@ epicsMessageQueueDestroy(epicsMessageQueueId pmsg) while ((evp = reinterpret_cast < struct eventNode * > ( ellGet(&pmsg->eventFreeList) ) ) != NULL) { - epicsEventDestroy(evp->event); - free(evp); + freeEventNode(evp); } epicsMutexDestroy(pmsg->mutex); free(pmsg->buf); @@ -114,9 +135,15 @@ getEventNode(epicsMessageQueueId pmsg) evp = reinterpret_cast < struct eventNode * > ( ellGet(&pmsg->eventFreeList) ); if (evp == NULL) { - evp = (struct eventNode *) callocMustSucceed(1, sizeof(*evp), - "epicsMessageQueueGetEventNode"); - evp->event = epicsEventMustCreate(epicsEventEmpty); + epicsEventId eid = epicsEventCreate(epicsEventEmpty); + evp = (struct eventNode *) calloc(1, sizeof(*evp)); + if(!evp || !eid) { + free(evp); + if(eid) + epicsEventDestroy(eid); + return NULL; + } + evp->event = eid; } return evp; } @@ -133,7 +160,9 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo /* * See if message can be sent */ - epicsMutexLock(pmsg->mutex); + if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK) + return -1; + if ((pmsg->numberOfSendersWaiting > 0) || (pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL))) { /* @@ -150,18 +179,32 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo struct threadNode threadNode; threadNode.evp = getEventNode(pmsg); threadNode.eventSent = false; + if (!threadNode.evp) { + epicsMutexUnlock(pmsg->mutex); + return -1; + } + ellAdd(&pmsg->sendQueue, &threadNode.link); pmsg->numberOfSendersWaiting++; + epicsMutexUnlock(pmsg->mutex); + if(haveTimeout) epicsEventWaitWithTimeout(threadNode.evp->event, timeout); else epicsEventWait(threadNode.evp->event); - epicsMutexLock(pmsg->mutex); + + if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){ + freeEventNode(threadNode.evp); + return -1; + } + if(!threadNode.eventSent) ellDelete(&pmsg->sendQueue, &threadNode.link); pmsg->numberOfSendersWaiting--; + ellAdd(&pmsg->eventFreeList, &threadNode.evp->link); + if (pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL)) { epicsMutexUnlock(pmsg->mutex); return -1; @@ -227,7 +270,9 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, /* * If there's a message on the queue, copy it */ - epicsMutexLock(pmsg->mutex); + if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK) + return -1; + myOutPtr = (char *)pmsg->outPtr; if ((myOutPtr != pmsg->inPtr) || pmsg->full) { int ret; @@ -282,17 +327,31 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, threadNode.buf = message; threadNode.size = size; threadNode.eventSent = false; + + if(!threadNode.evp) { + epicsMutexUnlock(pmsg->mutex); + return -1; + } + ellAdd(&pmsg->receiveQueue, &threadNode.link); epicsMutexUnlock(pmsg->mutex); + if(haveTimeout) epicsEventWaitWithTimeout(threadNode.evp->event, timeout); else epicsEventWait(threadNode.evp->event); - epicsMutexLock(pmsg->mutex); + + if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){ + freeEventNode(threadNode.evp); + return -1; + } + if(!threadNode.eventSent) ellDelete(&pmsg->receiveQueue, &threadNode.link); ellAdd(&pmsg->eventFreeList, &threadNode.evp->link); + epicsMutexUnlock(pmsg->mutex); + if(threadNode.eventSent && (threadNode.size <= size)) return threadNode.size; return -1; @@ -322,7 +381,7 @@ epicsMessageQueuePending(epicsMessageQueueId pmsg) char *myInPtr, *myOutPtr; int nmsg; - epicsMutexLock(pmsg->mutex); + epicsMutexMustLock(pmsg->mutex); myInPtr = (char *)pmsg->inPtr; myOutPtr = (char *)pmsg->outPtr; if (pmsg->full) From 503f46ec8c6e280e128ee45c5cbd46d1b5b3a8bb Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:58 -0700 Subject: [PATCH 6/8] posix osdMutex recursive type is not optional epicsMutexId is expected to be recursive so fail if this is not possible. --- src/libCom/osi/os/posix/osdMutex.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libCom/osi/os/posix/osdMutex.c b/src/libCom/osi/os/posix/osdMutex.c index b9e874b44..ec1e7097c 100644 --- a/src/libCom/osi/os/posix/osdMutex.c +++ b/src/libCom/osi/os/posix/osdMutex.c @@ -80,7 +80,9 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { status = pthread_mutexattr_settype(&pmutex->mutexAttr, PTHREAD_MUTEX_RECURSIVE); - if (errVerbose) checkStatus(status, "pthread_mutexattr_settype"); + checkStatus(status, "pthread_mutexattr_settype"); + if (status) + goto fail; status = pthread_mutex_init(&pmutex->lock, &pmutex->mutexAttr); if (status) From 9a1b6b995ea16de6b7c8202ca963896802e90d1c Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:33:59 -0700 Subject: [PATCH 7/8] macEnv avoid cantProceed --- src/libCom/macLib/macEnv.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/libCom/macLib/macEnv.c b/src/libCom/macLib/macEnv.c index 766d62473..4a77562c3 100644 --- a/src/libCom/macLib/macEnv.c +++ b/src/libCom/macLib/macEnv.c @@ -13,8 +13,9 @@ #include #include +#include + #define epicsExportSharedSymbols -#include "cantProceed.h" #include "epicsString.h" #include "macLib.h" @@ -27,8 +28,10 @@ macEnvExpand(const char *str) char *dest = NULL; int n; - if (macCreateHandle(&handle, pairs)) - cantProceed("macEnvExpand: macCreateHandle failed."); + if (macCreateHandle(&handle, pairs)){ + errlogMessage("macEnvExpand: macCreateHandle failed."); + return NULL; + } do { destCapacity *= 2; @@ -37,7 +40,10 @@ macEnvExpand(const char *str) * keep the original contents. */ free(dest); - dest = mallocMustSucceed(destCapacity, "macEnvExpand"); + dest = malloc(destCapacity); + if(!dest) + goto done; + n = macExpandString(handle, str, dest, destCapacity); } while (n >= (destCapacity - 1)); @@ -51,7 +57,8 @@ macEnvExpand(const char *str) dest = realloc(dest, n); } +done: if (macDeleteHandle(handle)) - cantProceed("macEnvExpand: macDeleteHandle failed."); + errlogMessage("macEnvExpand: macDeleteHandle failed."); return dest; } From 294e47db9c87ac1b83aee8722b8afcc3259a8fec Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Aug 2011 16:34:00 -0700 Subject: [PATCH 8/8] gpHashList avoid cantProceed handle allocation failures in gphAdd() --- src/libCom/gpHash/gpHashLib.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libCom/gpHash/gpHashLib.c b/src/libCom/gpHash/gpHashLib.c index 6a800531f..3cea5cb3a 100644 --- a/src/libCom/gpHash/gpHashLib.c +++ b/src/libCom/gpHash/gpHashLib.c @@ -104,7 +104,11 @@ GPHENTRY * epicsShareAPI gphAdd(gphPvt *pgphPvt, const char *name, void *pvtid) epicsMutexMustLock(pgphPvt->lock); plist = paplist[hash]; if (plist == NULL) { - plist = callocMustSucceed(1, sizeof(ELLLIST), "gphAdd"); + plist = calloc(1, sizeof(ELLLIST)); + if(!plist){ + epicsMutexUnlock(pgphPvt->lock); + return NULL; + } ellInit(plist); paplist[hash] = plist; } @@ -119,10 +123,12 @@ GPHENTRY * epicsShareAPI gphAdd(gphPvt *pgphPvt, const char *name, void *pvtid) pgphNode = (GPHENTRY *) ellNext((ELLNODE *)pgphNode); } - pgphNode = callocMustSucceed(1, sizeof(GPHENTRY), "gphAdd"); - pgphNode->name = name; - pgphNode->pvtid = pvtid; - ellAdd(plist, (ELLNODE *)pgphNode); + pgphNode = calloc(1, sizeof(GPHENTRY)); + if(pgphNode) { + pgphNode->name = name; + pgphNode->pvtid = pvtid; + ellAdd(plist, (ELLNODE *)pgphNode); + } epicsMutexUnlock(pgphPvt->lock); return (pgphNode);