]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/barrier.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 Copyright © 2014 David Herrmann <dh.herrmann@gmail.com>
10 #include <sys/types.h>
14 /* See source file for an API description. */
16 typedef struct Barrier Barrier
;
20 BARRIER_ABORTION
= INT64_MAX
,
22 /* bias values to store state; keep @WE < @THEY < @I */
23 BARRIER_BIAS
= INT64_MIN
,
24 BARRIER_WE_ABORTED
= BARRIER_BIAS
+ 1LL,
25 BARRIER_THEY_ABORTED
= BARRIER_BIAS
+ 2LL,
26 BARRIER_I_ABORTED
= BARRIER_BIAS
+ 3LL,
41 #define BARRIER_NULL {-1, -1, {-1, -1}, 0}
43 int barrier_create(Barrier
*obj
);
44 void barrier_destroy(Barrier
*b
);
46 DEFINE_TRIVIAL_CLEANUP_FUNC(Barrier
*, barrier_destroy
);
48 void barrier_set_role(Barrier
*b
, unsigned int role
);
50 bool barrier_place(Barrier
*b
);
51 bool barrier_abort(Barrier
*b
);
53 bool barrier_wait_next(Barrier
*b
);
54 bool barrier_wait_abortion(Barrier
*b
);
55 bool barrier_sync_next(Barrier
*b
);
56 bool barrier_sync(Barrier
*b
);
58 static inline bool barrier_i_aborted(Barrier
*b
) {
59 return IN_SET(b
->barriers
, BARRIER_I_ABORTED
, BARRIER_WE_ABORTED
);
62 static inline bool barrier_they_aborted(Barrier
*b
) {
63 return IN_SET(b
->barriers
, BARRIER_THEY_ABORTED
, BARRIER_WE_ABORTED
);
66 static inline bool barrier_we_aborted(Barrier
*b
) {
67 return b
->barriers
== BARRIER_WE_ABORTED
;
70 static inline bool barrier_is_aborted(Barrier
*b
) {
71 return IN_SET(b
->barriers
,
72 BARRIER_I_ABORTED
, BARRIER_THEY_ABORTED
, BARRIER_WE_ABORTED
);
75 static inline bool barrier_place_and_sync(Barrier
*b
) {
76 (void) barrier_place(b
);
77 return barrier_sync(b
);