]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/barrier.h
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / basic / barrier.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 /***
5 Copyright © 2014 David Herrmann <dh.herrmann@gmail.com>
6 ***/
7
8 #include <stdbool.h>
9 #include <stdint.h>
10 #include <sys/types.h>
11
12 #include "macro.h"
13
14 /* See source file for an API description. */
15
16 typedef struct Barrier Barrier;
17
18 enum {
19 BARRIER_SINGLE = 1LL,
20 BARRIER_ABORTION = INT64_MAX,
21
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,
27 };
28
29 enum {
30 BARRIER_PARENT,
31 BARRIER_CHILD,
32 };
33
34 struct Barrier {
35 int me;
36 int them;
37 int pipe[2];
38 int64_t barriers;
39 };
40
41 #define BARRIER_NULL {-1, -1, {-1, -1}, 0}
42
43 int barrier_create(Barrier *obj);
44 void barrier_destroy(Barrier *b);
45
46 DEFINE_TRIVIAL_CLEANUP_FUNC(Barrier*, barrier_destroy);
47
48 void barrier_set_role(Barrier *b, unsigned int role);
49
50 bool barrier_place(Barrier *b);
51 bool barrier_abort(Barrier *b);
52
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);
57
58 static inline bool barrier_i_aborted(Barrier *b) {
59 return IN_SET(b->barriers, BARRIER_I_ABORTED, BARRIER_WE_ABORTED);
60 }
61
62 static inline bool barrier_they_aborted(Barrier *b) {
63 return IN_SET(b->barriers, BARRIER_THEY_ABORTED, BARRIER_WE_ABORTED);
64 }
65
66 static inline bool barrier_we_aborted(Barrier *b) {
67 return b->barriers == BARRIER_WE_ABORTED;
68 }
69
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);
73 }
74
75 static inline bool barrier_place_and_sync(Barrier *b) {
76 (void) barrier_place(b);
77 return barrier_sync(b);
78 }