1 Conditional Variable pseudocode.
2 ================================
4 int pthread_cond_timedwait (pthread_cond_t *cv, pthread_mutex_t *mutex);
5 int pthread_cond_signal (pthread_cond_t *cv);
6 int pthread_cond_broadcast (pthread_cond_t *cv);
8 struct pthread_cond_t {
10 unsigned int cond_lock;
16 Total number of threads using the conditional variable.
20 sequence number for next wakeup.
24 sequence number of last woken thread.
37 /* make sure no signal gets lost. */
38 FUTEX_WAKE(cv->wakeup_seq, ALL);
44 cond_timedwait(cv, mutex, timeout):
52 val = seq = cv->wakeup_seq;
60 ret = FUTEX_WAIT(cv->wakeup_seq, val, timeout);
68 if (val > seq && cv->woken_seq < val) {
73 if (ret == TIMEDOUT) {
94 if (cv->total_seq > cv->wakeup_seq) {
96 FUTEX_WAKE(cv->wakeup_seq, 1);
106 if (cv->total_seq > cv->wakeup_seq) {
107 cv->wakeup_seq = cv->total_seq;
108 FUTEX_WAKE(cv->wakeup_seq, ALL);
111 lll_unlock(cv->lock);