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