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