1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <endian.h>
21: #include <errno.h>
22: #include <sysdep.h>
23: #include <lowlevellock.h>
24: #include <pthread.h>
25: #include <pthreadP.h>
26:
27: #include <shlib-compat.h>
28: #include <kernel-features.h>
29:
30:
31: int
32: __pthread_cond_signal (cond)
33: pthread_cond_t *cond;
34: {
35: int pshared = (cond->__data.__mutex == (void *) ~0l)
36: ? LLL_SHARED : LLL_PRIVATE;
37:
38:
39: lll_lock (cond->__data.__lock, pshared);
40:
41:
42: if (cond->__data.__total_seq > cond->__data.__wakeup_seq)
43: {
44:
45: ++cond->__data.__wakeup_seq;
46: ++cond->__data.__futex;
47:
48:
49: if (! __builtin_expect (lll_futex_wake_unlock (&cond->__data.__futex, 1,
50: 1, &cond->__data.__lock,
51: pshared), 0))
52: return 0;
53:
54: lll_futex_wake (&cond->__data.__futex, 1, pshared);
55: }
56:
57:
58: lll_unlock (cond->__data.__lock, pshared);
59:
60: return 0;
61: }
62:
63: versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
64: GLIBC_2_3_2);