]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/barrier.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
11 /* See source file for an API description. */
13 typedef struct Barrier Barrier
;
17 BARRIER_ABORTION
= INT64_MAX
,
19 /* bias values to store state; keep @WE < @THEY < @I */
20 BARRIER_BIAS
= INT64_MIN
,
21 BARRIER_WE_ABORTED
= BARRIER_BIAS
+ 1LL,
22 BARRIER_THEY_ABORTED
= BARRIER_BIAS
+ 2LL,
23 BARRIER_I_ABORTED
= BARRIER_BIAS
+ 3LL,
38 #define BARRIER_NULL {-1, -1, {-1, -1}, 0}
40 int barrier_create(Barrier
*obj
);
41 void barrier_destroy(Barrier
*b
);
43 DEFINE_TRIVIAL_CLEANUP_FUNC(Barrier
*, barrier_destroy
);
45 void barrier_set_role(Barrier
*b
, unsigned int role
);
47 bool barrier_place(Barrier
*b
);
48 bool barrier_abort(Barrier
*b
);
50 bool barrier_wait_next(Barrier
*b
);
51 bool barrier_wait_abortion(Barrier
*b
);
52 bool barrier_sync_next(Barrier
*b
);
53 bool barrier_sync(Barrier
*b
);
55 static inline bool barrier_i_aborted(Barrier
*b
) {
56 return IN_SET(b
->barriers
, BARRIER_I_ABORTED
, BARRIER_WE_ABORTED
);
59 static inline bool barrier_they_aborted(Barrier
*b
) {
60 return IN_SET(b
->barriers
, BARRIER_THEY_ABORTED
, BARRIER_WE_ABORTED
);
63 static inline bool barrier_we_aborted(Barrier
*b
) {
64 return b
->barriers
== BARRIER_WE_ABORTED
;
67 static inline bool barrier_is_aborted(Barrier
*b
) {
68 return IN_SET(b
->barriers
,
69 BARRIER_I_ABORTED
, BARRIER_THEY_ABORTED
, BARRIER_WE_ABORTED
);
72 static inline bool barrier_place_and_sync(Barrier
*b
) {
73 (void) barrier_place(b
);
74 return barrier_sync(b
);