powerpc-sf longjmp clobbering of val argument
[musl.git] / src / thread / sem_post.c
blob5c2517f23606d2b22bbf480394639f580b19b001
1 #include <semaphore.h>
2 #include <limits.h>
3 #include "pthread_impl.h"
5 int sem_post(sem_t *sem)
7 int val, new, waiters, priv = sem->__val[2];
8 do {
9 val = sem->__val[0];
10 waiters = sem->__val[1];
11 if ((val & SEM_VALUE_MAX) == SEM_VALUE_MAX) {
12 errno = EOVERFLOW;
13 return -1;
15 new = val + 1;
16 if (waiters <= 1)
17 new &= ~0x80000000;
18 } while (a_cas(sem->__val, val, new) != val);
19 if (val<0) __wake(sem->__val, waiters>1 ? 1 : -1, priv);
20 return 0;