#include #include void sem_init(struct sem_t *sem, unsigned int initial) { sem->counter = ATOMIC_VAR_INIT(initial); } void sem_wait(struct sem_t *sem) { while (!atomic_load(&sem->counter)) { schedule(); } atomic_fetch_sub(&sem->counter, 1); } void sem_post(struct sem_t *sem) { atomic_fetch_add(&sem->counter, 1); // TODO: wake up a thread }