fix wide printf forms ignoring width for %lc format specifier
[musl] / src / thread / sem_post.c
1 #include <semaphore.h>
2 #include <limits.h>
3 #include "pthread_impl.h"
4
5 int sem_post(sem_t *sem)
6 {
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;
14                 }
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;
21 }