Optimize for kernels which are known to have the vfork syscall.
[glibc/pb-stable.git] / nptl / DESIGN-sem-old.txt
blob2db2f35ce2b7ab9fc1e59cb24c8513bdf7927a00
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 lock:
12          - internal mutex
14    unsigned int count;
15          - current semaphore count, also used as a futex
17    unsigned int waiters;
18          - number of threads queued in sem_wait().
21 sem_wait(sem_t *sem)
23   lll_lock(sem->lock);
24   for (;;) {
26     if (sem->count)
27       break;
29     sem->waiters++;
30     lll_unlock(sem->lock);
32     futex_wait(&sem->count, 0)
34     lll_lock(sem->lock);
35     sem->waiters--;
36   }
37   sem->count--;
38   lll_unlock(sem->lock);
41 sem_post(sem_t *sem)
43   lll_lock(sem->lock);
44   sem->count++;
45   if (sem->waiters)
46     futex_wake(&sem->count, sem->count);
47   lll_unlock(sem->lock);
50 sem_trywait(sem_t *sem)
52   lll_lock(sem->lock);
53   if (sem->count) {
54     sem->count--;
55     lll_unlock(sem->lock);
56     return 0;
57   } else {
58     lll_unlock(sem->lock);
59     return -EAGAIN;
60   }
63 sem_getvalue(sem_t *sem, int *sval)
65   *sval = sem->count;
66   read_barrier();