summaryrefslogtreecommitdiff
path: root/pr/src/threads/prsem.c
diff options
context:
space:
mode:
Diffstat (limited to 'pr/src/threads/prsem.c')
-rw-r--r--pr/src/threads/prsem.c63
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