1 /*-------------------------------------------------------------------------
2  *
3  * barrier.h
4  *	  Barriers for synchronizing cooperating processes.
5  *
6  * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * src/include/storage/barrier.h
10  *
11  *-------------------------------------------------------------------------
12  */
13 #ifndef BARRIER_H
14 #define BARRIER_H
15 
16 /*
17  * For the header previously known as "barrier.h", please include
18  * "port/atomics.h", which deals with atomics, compiler barriers and memory
19  * barriers.
20  */
21 
22 #include "storage/condition_variable.h"
23 #include "storage/spin.h"
24 
25 typedef struct Barrier
26 {
27 	slock_t		mutex;
28 	int			phase;			/* phase counter */
29 	int			participants;	/* the number of participants attached */
30 	int			arrived;		/* the number of participants that have
31 								 * arrived */
32 	int			elected;		/* highest phase elected */
33 	bool		static_party;	/* used only for assertions */
34 	ConditionVariable condition_variable;
35 } Barrier;
36 
37 extern void BarrierInit(Barrier *barrier, int num_workers);
38 extern bool BarrierArriveAndWait(Barrier *barrier, uint32 wait_event_info);
39 extern bool BarrierArriveAndDetach(Barrier *barrier);
40 extern int	BarrierAttach(Barrier *barrier);
41 extern bool BarrierDetach(Barrier *barrier);
42 extern int	BarrierPhase(Barrier *barrier);
43 extern int	BarrierParticipants(Barrier *barrier);
44 
45 #endif							/* BARRIER_H */
46