123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #include <errno.h>
- #include <sysdep.h>
- #include <lowlevellock.h>
- #include <internaltypes.h>
- #include <semaphore.h>
- int
- sem_post (sem_t *sem)
- {
- struct new_sem *isem = (struct new_sem *) sem;
- __asm__ __volatile__ (__lll_rel_instr ::: "memory");
- atomic_increment (&isem->value);
- __asm__ __volatile__ (__lll_acq_instr ::: "memory");
- 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;
- }
|