OLD | NEW |
1 #include <semaphore.h> | 1 #include <semaphore.h> |
2 #include "pthread_impl.h" | 2 #include "pthread_impl.h" |
3 | 3 |
4 int sem_post(sem_t *sem) | 4 int sem_post(sem_t* sem) { |
5 { | 5 int val, waiters, priv = sem->__val[2]; |
6 » int val, waiters, priv = sem->__val[2]; | 6 do { |
7 » do { | 7 val = sem->__val[0]; |
8 » » val = sem->__val[0]; | 8 waiters = sem->__val[1]; |
9 » » waiters = sem->__val[1]; | 9 if (val == SEM_VALUE_MAX) { |
10 » » if (val == SEM_VALUE_MAX) { | 10 errno = EOVERFLOW; |
11 » » » errno = EOVERFLOW; | 11 return -1; |
12 » » » return -1; | 12 } |
13 » » } | 13 } while (a_cas(sem->__val, val, val + 1 + (val < 0)) != val); |
14 » } while (a_cas(sem->__val, val, val+1+(val<0)) != val); | 14 if (val < 0 || waiters) |
15 » if (val<0 || waiters) __wake(sem->__val, 1, priv); | 15 __wake(sem->__val, 1, priv); |
16 » return 0; | 16 return 0; |
17 } | 17 } |
OLD | NEW |