Rich Felker | 6fc5fdb | 2011-03-04 00:45:59 -0500 | [diff] [blame] | 1 | #include <semaphore.h> |
| 2 | #include "pthread_impl.h" |
| 3 | |
| 4 | int sem_post(sem_t *sem) |
| 5 | { |
Rich Felker | bc09d58 | 2014-08-15 23:54:52 -0400 | [diff] [blame] | 6 | int val, waiters, priv = sem->__val[2]; |
Rich Felker | 88c4e72 | 2011-08-02 19:19:09 -0400 | [diff] [blame] | 7 | do { |
| 8 | val = sem->__val[0]; |
| 9 | waiters = sem->__val[1]; |
Rich Felker | 2612095 | 2011-10-26 00:28:47 -0400 | [diff] [blame] | 10 | if (val == SEM_VALUE_MAX) { |
| 11 | errno = EOVERFLOW; |
| 12 | return -1; |
| 13 | } |
Rich Felker | 88c4e72 | 2011-08-02 19:19:09 -0400 | [diff] [blame] | 14 | } while (a_cas(sem->__val, val, val+1+(val<0)) != val); |
Rich Felker | bc09d58 | 2014-08-15 23:54:52 -0400 | [diff] [blame] | 15 | if (val<0 || waiters) __wake(sem->__val, 1, priv); |
Rich Felker | 6fc5fdb | 2011-03-04 00:45:59 -0500 | [diff] [blame] | 16 | return 0; |
| 17 | } |