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