123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #include <errno.h>
- #include <sysdep.h>
- #include <lowlevellock.h>
- #include <internaltypes.h>
- #include <semaphore.h>
- #include <tls.h>
- int
- sem_post (sem_t *sem)
- {
- struct new_sem *isem = (struct new_sem *) sem;
- __typeof (isem->value) cur;
- do
- {
- cur = isem->value;
- if (isem->value == SEM_VALUE_MAX)
- {
- __set_errno (EOVERFLOW);
- return -1;
- }
- }
- while (atomic_compare_and_exchange_bool_acq (&isem->value, cur + 1, cur));
- atomic_full_barrier ();
- if (isem->nwaiters > 0)
- {
- int err = lll_futex_wake (&isem->value, 1,
- isem->private ^ FUTEX_PRIVATE_FLAG);
- if (__builtin_expect (err, 0) < 0)
- {
- __set_errno (-err);
- return -1;
- }
- }
- return 0;
- }
|