1 /*-------------------------------------------------------------------------
3 * pthread_barrier_wait.c
4 * Implementation of pthread_barrier_t support for platforms lacking it.
6 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
9 * src/port/pthread_barrier_wait.c
11 *-------------------------------------------------------------------------
16 #include "port/pg_pthread.h"
19 pthread_barrier_init(pthread_barrier_t
*barrier
, const void *attr
, int count
)
23 barrier
->sense
= false;
24 barrier
->count
= count
;
26 if ((error
= pthread_cond_init(&barrier
->cond
, NULL
)) != 0)
28 if ((error
= pthread_mutex_init(&barrier
->mutex
, NULL
)) != 0)
30 pthread_cond_destroy(&barrier
->cond
);
38 pthread_barrier_wait(pthread_barrier_t
*barrier
)
42 pthread_mutex_lock(&barrier
->mutex
);
44 /* We have arrived at the barrier. */
46 Assert(barrier
->arrived
<= barrier
->count
);
48 /* If we were the last to arrive, release the others and return. */
49 if (barrier
->arrived
== barrier
->count
)
52 barrier
->sense
= !barrier
->sense
;
53 pthread_mutex_unlock(&barrier
->mutex
);
54 pthread_cond_broadcast(&barrier
->cond
);
56 return PTHREAD_BARRIER_SERIAL_THREAD
;
59 /* Wait for someone else to flip the sense. */
60 initial_sense
= barrier
->sense
;
63 pthread_cond_wait(&barrier
->cond
, &barrier
->mutex
);
64 } while (barrier
->sense
== initial_sense
);
66 pthread_mutex_unlock(&barrier
->mutex
);
72 pthread_barrier_destroy(pthread_barrier_t
*barrier
)
74 pthread_cond_destroy(&barrier
->cond
);
75 pthread_mutex_destroy(&barrier
->mutex
);