1Semaphores pseudocode
2==============================
3
4       int sem_wait(sem_t * sem);
5       int sem_trywait(sem_t * sem);
6       int sem_post(sem_t * sem);
7       int sem_getvalue(sem_t * sem, int * sval);
8
9struct sem_t {
10
11   unsigned int count;
12         - current semaphore count, also used as a futex
13}
14
15sem_wait(sem_t *sem)
16{
17  for (;;) {
18
19    if (atomic_decrement_if_positive(sem->count))
20      break;
21
22    futex_wait(&sem->count, 0)
23  }
24}
25
26sem_post(sem_t *sem)
27{
28  n = atomic_increment(sem->count);
29  // Pass the new value of sem->count
30  futex_wake(&sem->count, n + 1);
31}
32
33sem_trywait(sem_t *sem)
34{
35  if (atomic_decrement_if_positive(sem->count)) {
36    return 0;
37  } else {
38    return EAGAIN;
39  }
40}
41
42sem_getvalue(sem_t *sem, int *sval)
43{
44  *sval = sem->count;
45  read_barrier();
46}
47