12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- Semaphores pseudocode
- ==============================
- int sem_wait(sem_t * sem);
- int sem_trywait(sem_t * sem);
- int sem_post(sem_t * sem);
- int sem_getvalue(sem_t * sem, int * sval);
- struct sem_t {
- unsigned int count;
- - current semaphore count, also used as a futex
- }
- sem_wait(sem_t *sem)
- {
- for (;;) {
- if (atomic_decrement_if_positive(sem->count))
- break;
- futex_wait(&sem->count, 0)
- }
- }
- sem_post(sem_t *sem)
- {
- n = atomic_increment(sem->count);
- // Pass the new value of sem->count
- futex_wake(&sem->count, n + 1);
- }
- sem_trywait(sem_t *sem)
- {
- if (atomic_decrement_if_positive(sem->count)) {
- return 0;
- } else {
- return EAGAIN;
- }
- }
- sem_getvalue(sem_t *sem, int *sval)
- {
- *sval = sem->count;
- read_barrier();
- }
|