]> sourceware.org Git - glibc.git/blame - nptl/DESIGN-sem.txt
Fix inet_network("1 bar"). Fixes bug 15277.
[glibc.git] / nptl / DESIGN-sem.txt
CommitLineData
76a50749
UD
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);
4e502c60
UD
29 // Pass the new value of sem->count
30 futex_wake(&sem->count, n + 1);
76a50749
UD
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}
This page took 0.267096 seconds and 5 git commands to generate.