1 // SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
3 // SPDX-License-Identifier: LGPL-2.1-or-later
5 #ifndef _URCU_ANNOTATE_H
6 #define _URCU_ANNOTATE_H
11 * Userspace RCU - annotation header.
17 * This API is highly experimental. There is zero guarantees of stability
20 * You have been warned.
26 #include <urcu/compiler.h>
35 typedef enum cmm_annotate cmm_annotate_t
__attribute__((unused
));
37 #define cmm_annotate_define(name) \
38 cmm_annotate_t name = CMM_ANNOTATE_VOID
40 #ifdef CMM_SANITIZE_THREAD
45 extern void __tsan_acquire(void *);
46 extern void __tsan_release(void *);
51 # define cmm_annotate_die(msg) \
54 "(" __FILE__ ":%s@%u) Annotation ERROR: %s\n", \
55 __func__, __LINE__, msg); \
59 /* Only used for typechecking in macros. */
60 static inline cmm_annotate_t
cmm_annotate_dereference(cmm_annotate_t
*group
)
65 # define cmm_annotate_group_mb_acquire(group) \
67 switch (cmm_annotate_dereference(group)) { \
68 case CMM_ANNOTATE_VOID: \
70 case CMM_ANNOTATE_LOAD: \
72 case CMM_ANNOTATE_STORE: \
73 cmm_annotate_die("store for acquire group"); \
75 case CMM_ANNOTATE_MB: \
77 "redundant mb for acquire group" \
81 *(group) = CMM_ANNOTATE_MB; \
84 # define cmm_annotate_group_mb_release(group) \
86 switch (cmm_annotate_dereference(group)) { \
87 case CMM_ANNOTATE_VOID: \
89 case CMM_ANNOTATE_LOAD: \
90 cmm_annotate_die("load before release group"); \
92 case CMM_ANNOTATE_STORE: \
94 "store before release group" \
97 case CMM_ANNOTATE_MB: \
99 "redundant mb of release group" \
103 *(group) = CMM_ANNOTATE_MB; \
106 # define cmm_annotate_group_mem_acquire(group, mem) \
108 __tsan_acquire((void*)(mem)); \
109 switch (cmm_annotate_dereference(group)) { \
110 case CMM_ANNOTATE_VOID: \
111 *(group) = CMM_ANNOTATE_LOAD; \
113 case CMM_ANNOTATE_MB: \
115 "load after mb for acquire group" \
123 # define cmm_annotate_group_mem_release(group, mem) \
125 __tsan_release((void*)(mem)); \
126 switch (cmm_annotate_dereference(group)) { \
127 case CMM_ANNOTATE_MB: \
131 "missing mb for release group" \
136 # define cmm_annotate_mem_acquire(mem) \
137 __tsan_acquire((void*)(mem))
139 # define cmm_annotate_mem_release(mem) \
140 __tsan_release((void*)(mem))
143 # define cmm_annotate_group_mb_acquire(group) \
146 # define cmm_annotate_group_mb_release(group) \
149 # define cmm_annotate_group_mem_acquire(group, mem) \
152 # define cmm_annotate_group_mem_release(group, mem) \
155 # define cmm_annotate_mem_acquire(mem) \
158 # define cmm_annotate_mem_release(mem) \
161 #endif /* CMM_SANITIZE_THREAD */
163 #endif /* _URCU_ANNOTATE_H */