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