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; }