diff --git a/src/libCom/osi/os/default/osdMessageQueue.cpp b/src/libCom/osi/os/default/osdMessageQueue.cpp index 2e5343bbc..9f589aaf4 100644 --- a/src/libCom/osi/os/default/osdMessageQueue.cpp +++ b/src/libCom/osi/os/default/osdMessageQueue.cpp @@ -135,21 +135,21 @@ 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) { - free(evp); - if(eid) - epicsEventDestroy(eid); - return NULL; + if (evp) { + evp->event = epicsEventCreate(epicsEventEmpty); + if (evp->event == NULL) { + free(evp); + return NULL; + } } - evp->event = eid; } return evp; } static int -mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bool haveTimeout, double timeout) +mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, + double timeout) { char *myInPtr, *nextPtr; struct threadNode *pthr; @@ -160,15 +160,14 @@ 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))) { /* * Return if not allowed to wait */ - if (!wait) { + if (timeout == 0) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -189,15 +188,13 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo epicsMutexUnlock(pmsg->mutex); - if(haveTimeout) - epicsEventWaitWithTimeout(threadNode.evp->event, timeout); + epicsEventStatus status; + if (timeout > 0) + status = epicsEventWaitWithTimeout(threadNode.evp->event, timeout); else - epicsEventWait(threadNode.evp->event); + status = 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); @@ -205,7 +202,8 @@ 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)) || + status != epicsEventOK) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -243,25 +241,29 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo } epicsShareFunc int epicsShareAPI -epicsMessageQueueTrySend(epicsMessageQueueId pmsg, void *message, unsigned int size) +epicsMessageQueueTrySend(epicsMessageQueueId pmsg, void *message, + unsigned int size) { - return mySend(pmsg, message, size, false, false, 0.0); + return mySend(pmsg, message, size, 0); } epicsShareFunc int epicsShareAPI -epicsMessageQueueSend(epicsMessageQueueId pmsg, void *message, unsigned int size) +epicsMessageQueueSend(epicsMessageQueueId pmsg, void *message, + unsigned int size) { - return mySend(pmsg, message, size, true, false, 0.0); + return mySend(pmsg, message, size, -1); } epicsShareFunc int epicsShareAPI -epicsMessageQueueSendWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout) +epicsMessageQueueSendWithTimeout(epicsMessageQueueId pmsg, void *message, + unsigned int size, double timeout) { - return mySend(pmsg, message, size, true, true, timeout); + return mySend(pmsg, message, size, timeout); } static int -myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bool haveTimeout, double timeout) +myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, + double timeout) { char *myOutPtr; unsigned long l; @@ -270,8 +272,7 @@ 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) { @@ -305,7 +306,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, /* * Return if not allowed to wait */ - if (!wait) { + if (timeout == 0) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -328,7 +329,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, threadNode.size = size; threadNode.eventSent = false; - if(!threadNode.evp) { + if (!threadNode.evp) { epicsMutexUnlock(pmsg->mutex); return -1; } @@ -336,43 +337,45 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, ellAdd(&pmsg->receiveQueue, &threadNode.link); epicsMutexUnlock(pmsg->mutex); - if(haveTimeout) - epicsEventWaitWithTimeout(threadNode.evp->event, timeout); + epicsEventStatus status; + if (timeout > 0) + status = epicsEventWaitWithTimeout(threadNode.evp->event, timeout); else - epicsEventWait(threadNode.evp->event); + status = epicsEventWait(threadNode.evp->event); - if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){ - freeEventNode(threadNode.evp); - return -1; - } + epicsMutexMustLock(pmsg->mutex); - if(!threadNode.eventSent) + if (!threadNode.eventSent) ellDelete(&pmsg->receiveQueue, &threadNode.link); ellAdd(&pmsg->eventFreeList, &threadNode.evp->link); epicsMutexUnlock(pmsg->mutex); - if(threadNode.eventSent && (threadNode.size <= size)) + if (threadNode.eventSent && (threadNode.size <= size) && + status == epicsEventOK) return threadNode.size; return -1; } epicsShareFunc int epicsShareAPI -epicsMessageQueueTryReceive(epicsMessageQueueId pmsg, void *message, unsigned int size) +epicsMessageQueueTryReceive(epicsMessageQueueId pmsg, void *message, + unsigned int size) { - return myReceive(pmsg, message, size, false, false, 0.0); + return myReceive(pmsg, message, size, 0); } epicsShareFunc int epicsShareAPI -epicsMessageQueueReceive(epicsMessageQueueId pmsg, void *message, unsigned int size) +epicsMessageQueueReceive(epicsMessageQueueId pmsg, void *message, + unsigned int size) { - return myReceive(pmsg, message, size, true, false, 0.0); + return myReceive(pmsg, message, size, -1); } epicsShareFunc int epicsShareAPI -epicsMessageQueueReceiveWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout) +epicsMessageQueueReceiveWithTimeout(epicsMessageQueueId pmsg, void *message, + unsigned int size, double timeout) { - return myReceive(pmsg, message, size, true, true, timeout); + return myReceive(pmsg, message, size, timeout); } epicsShareFunc int epicsShareAPI 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 fdf475802..3c8844f70 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -3,11 +3,9 @@ * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. -* EPICS BASE Versions 3.13.7 -* and higher are distributed subject to a Software License Agreement found +* EPICS BASE is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. \*************************************************************************/ -/* epicsThread.c */ /* Author: Marty Kraimer Date: 18JAN2000 */ @@ -72,7 +70,7 @@ typedef struct epicsThreadOSD { int isFifoScheduled; int isOnThreadList; unsigned int osiPriority; - char *name; + char name[1]; /* actually larger */ } epicsThreadOSD; #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING @@ -158,7 +156,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); @@ -166,7 +165,6 @@ static epicsThreadOSD * create_threadInfo(const char *name) free(pthreadInfo); return NULL; } - pthreadInfo->name = (char*)&pthreadInfo[1]; strcpy(pthreadInfo->name, name); return pthreadInfo; } @@ -206,17 +204,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); } @@ -539,8 +533,7 @@ static epicsThreadOSD *createImplicit(void) tid = pthread_self(); sprintf(name, "non-EPICS_%ld", (long)tid); pthreadInfo = create_threadInfo(name); - if(!pthreadInfo) - return NULL; + assert(pthreadInfo); pthreadInfo->tid = tid; pthreadInfo->osiPriority = 0; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) @@ -823,6 +816,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); } 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);