diff options
Diffstat (limited to 'pr/src/threads/prsem.c')
-rw-r--r-- | pr/src/threads/prsem.c | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/pr/src/threads/prsem.c b/pr/src/threads/prsem.c index 4b1617ca..120075b0 100644 --- a/pr/src/threads/prsem.c +++ b/pr/src/threads/prsem.c @@ -26,16 +26,16 @@ PR_IMPLEMENT(PRSemaphore*) PR_NewSem(PRUintn value) if (!lock) { PR_DELETE(sem); return NULL; - } + } cvar = PR_NewCondVar(lock); if (!cvar) { PR_DestroyLock(lock); PR_DELETE(sem); return NULL; - } - sem->cvar = cvar; - sem->count = value; + } + sem->cvar = cvar; + sem->count = value; #endif } return sem; @@ -75,25 +75,27 @@ PR_IMPLEMENT(void) PR_DestroySem(PRSemaphore *sem) */ PR_IMPLEMENT(PRStatus) PR_WaitSem(PRSemaphore *sem) { - PRStatus status = PR_SUCCESS; + PRStatus status = PR_SUCCESS; #ifdef HAVE_CVAR_BUILT_ON_SEM - return _PR_MD_WAIT_SEM(&sem->md); + return _PR_MD_WAIT_SEM(&sem->md); #else - PR_Lock(sem->cvar->lock); - while (sem->count == 0) { - sem->waiters++; - status = PR_WaitCondVar(sem->cvar, PR_INTERVAL_NO_TIMEOUT); - sem->waiters--; - if (status != PR_SUCCESS) - break; - } - if (status == PR_SUCCESS) - sem->count--; - PR_Unlock(sem->cvar->lock); + PR_Lock(sem->cvar->lock); + while (sem->count == 0) { + sem->waiters++; + status = PR_WaitCondVar(sem->cvar, PR_INTERVAL_NO_TIMEOUT); + sem->waiters--; + if (status != PR_SUCCESS) { + break; + } + } + if (status == PR_SUCCESS) { + sem->count--; + } + PR_Unlock(sem->cvar->lock); #endif - return (status); + return (status); } /* @@ -104,13 +106,14 @@ PR_IMPLEMENT(PRStatus) PR_WaitSem(PRSemaphore *sem) PR_IMPLEMENT(void) PR_PostSem(PRSemaphore *sem) { #ifdef HAVE_CVAR_BUILT_ON_SEM - _PR_MD_POST_SEM(&sem->md); + _PR_MD_POST_SEM(&sem->md); #else - PR_Lock(sem->cvar->lock); - if (sem->waiters) - PR_NotifyCondVar(sem->cvar); - sem->count++; - PR_Unlock(sem->cvar->lock); + PR_Lock(sem->cvar->lock); + if (sem->waiters) { + PR_NotifyCondVar(sem->cvar); + } + sem->count++; + PR_Unlock(sem->cvar->lock); #endif } @@ -123,16 +126,16 @@ PR_IMPLEMENT(void) PR_PostSem(PRSemaphore *sem) */ PR_IMPLEMENT(PRUintn) PR_GetValueSem(PRSemaphore *sem) { - PRUintn rv; + PRUintn rv; #ifdef HAVE_CVAR_BUILT_ON_SEM - rv = _PR_MD_GET_VALUE_SEM(&sem->md); + rv = _PR_MD_GET_VALUE_SEM(&sem->md); #else - PR_Lock(sem->cvar->lock); - rv = sem->count; - PR_Unlock(sem->cvar->lock); + PR_Lock(sem->cvar->lock); + rv = sem->count; + PR_Unlock(sem->cvar->lock); #endif - return rv; + return rv; } #endif |