diff options
author | David 'Digit' Turner <digit@google.com> | 2010-02-12 12:50:32 -0800 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2010-02-12 12:50:32 -0800 |
commit | 4f920f685bb4af8400c70383eecf347a35353778 (patch) | |
tree | b48d0f32e745f252a4ad5781e8da60f45415f7de | |
parent | 294dd0b86b1484aec7549663aff5b19c98a4b7fd (diff) | |
download | bionic-4f920f685bb4af8400c70383eecf347a35353778.zip bionic-4f920f685bb4af8400c70383eecf347a35353778.tar.gz bionic-4f920f685bb4af8400c70383eecf347a35353778.tar.bz2 |
Fix sem_post() behaviour to wake up multiple waiting threads.
-rw-r--r-- | libc/bionic/semaphore.c | 2 | ||||
-rw-r--r-- | libc/docs/CHANGES.TXT | 3 |
2 files changed, 4 insertions, 1 deletions
diff --git a/libc/bionic/semaphore.c b/libc/bionic/semaphore.c index f4eebce..84b9314 100644 --- a/libc/bionic/semaphore.c +++ b/libc/bionic/semaphore.c @@ -180,7 +180,7 @@ int sem_post(sem_t *sem) if (sem == NULL) return EINVAL; - if (__atomic_inc((volatile int*)&sem->count) == 0) + if (__atomic_inc((volatile int*)&sem->count) >= 0) __futex_wake(&sem->count, 1); return 0; diff --git a/libc/docs/CHANGES.TXT b/libc/docs/CHANGES.TXT index 7c8f38c..f59cfab 100644 --- a/libc/docs/CHANGES.TXT +++ b/libc/docs/CHANGES.TXT @@ -55,6 +55,9 @@ Differences between current and Android 2.1: - fix sem_trywait() to return -1 and set errno to EAGAIN, instead of returning EAGAIN directly. +- fix sem_post() to wake up multiple threads when called rapidly in + succession. + ------------------------------------------------------------------------------- Differences between Android 2.1 and 2.0.1: |