posix osdMutex don't use cantProceed

This commit is contained in:
Michael Davidsaver
2011-08-26 16:33:55 -07:00
committed by Michael Davidsaver
parent e15e42cff3
commit 860a22a90b

View File

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