diff options
author | rpj <rpj> | 2004-10-22 15:06:41 +0000 |
---|---|---|
committer | rpj <rpj> | 2004-10-22 15:06:41 +0000 |
commit | 045278e11b53fc1ad59945427feab1cd9275988f (patch) | |
tree | da8570a7a8962d9563814c4910e8a9d5fb6fa685 /sem_post_multiple.c | |
parent | f84df26e12431bb9ecd07fbc52c804538635901f (diff) |
Changes to mutexes and semaphores - considered alpha for now
Diffstat (limited to 'sem_post_multiple.c')
-rw-r--r-- | sem_post_multiple.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/sem_post_multiple.c b/sem_post_multiple.c index e30e01a..89368f0 100644 --- a/sem_post_multiple.c +++ b/sem_post_multiple.c @@ -78,9 +78,10 @@ sem_post_multiple (sem_t * sem, int count) int result = 0; #ifndef NEED_SEM long waiters; + sem_t s = *sem; #endif - if (sem == NULL || *sem == NULL || count <= 0) + if (s == NULL || count <= 0) { result = EINVAL; } @@ -88,18 +89,28 @@ sem_post_multiple (sem_t * sem, int count) #ifdef NEED_SEM else if (!ptw32_increase_semaphore (sem, count)) + { + result = EINVAL; + } #else /* NEED_SEM */ - else if ((waiters = -InterlockedExchangeAdd((LPLONG) &(*sem)->value, (LONG) count)) > 0 - && !ReleaseSemaphore((*sem)->sem, (waiters<=count)?waiters:count, 0)) - -#endif /* NEED_SEM */ - + else if ((result = pthread_mutex_lock (&s->lock)) == 0) { - result = EINVAL; + waiters = -s->value; + s->value += count; + if (waiters > 0) + { + if (!ReleaseSemaphore (s->sem, (waiters<=count)?waiters:count, 0)) + { + result = EINVAL; + } + } + (void) pthread_mutex_unlock (&s->lock); } +#endif /* NEED_SEM */ + if (result != 0) { errno = result; |