| 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(); |
| } |