| 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 |