Changes and additions migrated from cvs.devel.redhat.com:/cvs/devel/glibc to fedora...
[glibc.git] / nptl / DESIGN-sem.txt
blob17eb0c11c876dc8677c22ee74f461f82fdded61d
1 Semaphores pseudocode
2 ==============================
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);
9 struct sem_t {
11    unsigned int count;
12          - current semaphore count, also used as a futex
15 sem_wait(sem_t *sem)
17   for (;;) {
19     if (atomic_decrement_if_positive(sem->count))
20       break;
22     futex_wait(&sem->count, 0)
23   }
26 sem_post(sem_t *sem)
28   n = atomic_increment(sem->count);
29   // Pass the new value of sem->count
30   futex_wake(&sem->count, n + 1);
33 sem_trywait(sem_t *sem)
35   if (atomic_decrement_if_positive(sem->count)) {
36     return 0;
37   } else {
38     return EAGAIN;
39   }
42 sem_getvalue(sem_t *sem, int *sval)
44   *sval = sem->count;
45   read_barrier();