]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/barrier.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 This file is part of systemd.
7 Copyright 2014 David Herrmann <dh.herrmann@gmail.com>
12 #include <sys/types.h>
16 /* See source file for an API description. */
18 typedef struct Barrier Barrier
;
22 BARRIER_ABORTION
= INT64_MAX
,
24 /* bias values to store state; keep @WE < @THEY < @I */
25 BARRIER_BIAS
= INT64_MIN
,
26 BARRIER_WE_ABORTED
= BARRIER_BIAS
+ 1LL,
27 BARRIER_THEY_ABORTED
= BARRIER_BIAS
+ 2LL,
28 BARRIER_I_ABORTED
= BARRIER_BIAS
+ 3LL,
43 #define BARRIER_NULL {-1, -1, {-1, -1}, 0}
45 int barrier_create(Barrier
*obj
);
46 void barrier_destroy(Barrier
*b
);
48 DEFINE_TRIVIAL_CLEANUP_FUNC(Barrier
*, barrier_destroy
);
50 void barrier_set_role(Barrier
*b
, unsigned int role
);
52 bool barrier_place(Barrier
*b
);
53 bool barrier_abort(Barrier
*b
);
55 bool barrier_wait_next(Barrier
*b
);
56 bool barrier_wait_abortion(Barrier
*b
);
57 bool barrier_sync_next(Barrier
*b
);
58 bool barrier_sync(Barrier
*b
);
60 static inline bool barrier_i_aborted(Barrier
*b
) {
61 return IN_SET(b
->barriers
, BARRIER_I_ABORTED
, BARRIER_WE_ABORTED
);
64 static inline bool barrier_they_aborted(Barrier
*b
) {
65 return IN_SET(b
->barriers
, BARRIER_THEY_ABORTED
, BARRIER_WE_ABORTED
);
68 static inline bool barrier_we_aborted(Barrier
*b
) {
69 return b
->barriers
== BARRIER_WE_ABORTED
;
72 static inline bool barrier_is_aborted(Barrier
*b
) {
73 return IN_SET(b
->barriers
,
74 BARRIER_I_ABORTED
, BARRIER_THEY_ABORTED
, BARRIER_WE_ABORTED
);
77 static inline bool barrier_place_and_sync(Barrier
*b
) {
78 (void) barrier_place(b
);
79 return barrier_sync(b
);