posix osdMutex don't use cantProceed
This commit is contained in:
committed by
Michael Davidsaver
parent
e15e42cff3
commit
860a22a90b
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user