eĿlipsis
a language independent preprocessor
 
Loading...
Searching...
No Matches
ellipsis-once.h
Go to the documentation of this file.
1#ifndef ELLIPSIS_ONCE_H
2#define ELLIPSIS_ONCE_H
3
4#include_directives <ellipsis-loc.h> __prefix__(bind LOC_NAME ONCE)
5#include <stdlib.h>
6#if __STDC_VERSION_STDLIB_H__ < 202311L
7#include <threads.h>
8#endif
9
61#define _ONCE_INIT(NAME) NAME ∷_Once∷init
62#define _ONCE_USER(NAME) NAME ∷_Once∷init∷user
63#define _ONCE_CALLBACK(NAME) NAME ∷_Once∷init∷callback
64#define _ONCE_ATEXIT_POINTER(NAME) NAME ∷_Once∷atexit∷pointer
65#define _ONCE_ATEXIT_CALLBACK(NAME) NAME ∷_Once∷atexit∷callback
66#define _ONCE_AT_QUICK_EXIT_POINTER(NAME) NAME ∷_Once∷at_quick_exit∷pointer
67#define _ONCE_AT_QUICK_EXIT_CALLBACK(NAME) NAME ∷_Once∷at_quick_exit∷callback
68#define _ONCE_STRONG_FLAG(NAME) NAME ∷_Once∷strong
69
70#define _ONCE_DOTTY_ARC(A, B) "ONCE_DEPEND_MARKER: " A " -> " B
71#define _ONCE_DOTTY_NODE(A, ...) "ONCE_DEPEND_MARKER: " A " [" #__VA_ARGS__ "]"
72
73
74#ifdef __ELLIPSIS__
75# define _ONCE_DOTTY_FILE ⸤__FILE__⸥
76#else
77# define _ONCE_DOTTY_FILE __FILE__
78#endif
79
80<|
81#define _ONCE_DECLARE(NAME)
82 [[maybe_unused]] extern bool const _ONCE_STRONG_FLAG(NAME);
83 void _ONCE_INIT(NAME)(void)
84|>
85
87
88<|
89#define _ONCE_DEPEND_I(NAME, ...)
90 _ONCE_DECLARE(NAME);
91 GNU_ATTR_USED [[__maybe_unused__]]
92 static char const ONCE_NEW[]
94 _ONCE_INIT(NAME)()
95|>
96
98
99<|
100#define _ONCE_DEFINE_I(NAME, ...)
101/*^*/ static void _ONCE_USER(NAME)(void);
102/*^*/ static void (*const _ONCE_ATEXIT_POINTER(NAME))(void);
103/*^*/ static void (*const _ONCE_AT_QUICK_EXIT_POINTER(NAME))(void);
104/*^*/ static void _ONCE_CALLBACK(NAME)(void) {
105/*^*/ GNU_ATTR_USED [[__maybe_unused__]]
106/*^*/ static char const ONCE_NEW[]
108/*^*/ "\n" _ONCE_DOTTY_NODE(__STRINGIFY__(NAME), shape=box,color=blue);
109/*^*/ _ONCE_USER(NAME)();
110/*^*/ if (_ONCE_ATEXIT_POINTER(NAME)) {
111/*^*/ atexit(_ONCE_ATEXIT_POINTER(NAME));
112/*^*/ }
113/*^*/ if (_ONCE_AT_QUICK_EXIT_POINTER(NAME)) {
114/*^*/ at_quick_exit(_ONCE_AT_QUICK_EXIT_POINTER(NAME));
115/*^*/ }
116/*^*/ }
117/*^*/ void _ONCE_INIT(NAME)(void) {
118/*^*/ static once_flag ONCE_NEW = ONCE_FLAG_INIT;
119/*^*/ call_once(&ONCE(), _ONCE_CALLBACK(NAME));
120/*^*/ }
121/*^*/ static void _ONCE_USER(NAME)(void)
122|>
123
125
126#if __has_c_attribute(__gnu__::__constructor__)
127<|
128#define _ONCE_DEPEND_WEAK_I(NAME, ...)
129/*^*/ _ONCE_DECLARE(NAME);
130/*^*/ GNU_ATTR_USED [[__maybe_unused__]]
131/*^*/ static char const ONCE_NEW[]
132/*^*/ = _ONCE_DOTTY_ARC(_ONCE_DOTTY_FILE, __STRINGIFY__(NAME)) " [color=red] ";
133/*^*/ GNU_ATTR_USED [[__maybe_unused__]]
134/*^*/ static bool const*const ONCE_NEW = &_ONCE_STRONG_FLAG(NAME)
135|>
136
137#define _ONCE_IS_STRONG
138#define _ONCE_STRONG_INIT = true
139#else
140
141<|
142#define _ONCE_DEPEND_WEAK_I(NAME, ...)
143/*^*/ _ONCE_DECLARE(NAME);
144/*^*/ GNU_ATTR_USED [[__maybe_unused__]]
145/*^*/ static char const ONCE_NEW[]
146/*^*/ = _ONCE_DOTTY_ARC(_ONCE_DOTTY_FILE, __STRINGIFY__(NAME)) " [color=red] ";
147/*^*/ _Once_NAME_init()
148|>
149
150#define _ONCE_IS_STRONG extern
151#define _ONCE_STRONG_INIT
152#endif
153
154#define _ONCE_DEFINE_STRONG(...) _ONCE_DEFINE_STRONG_I(__VA_ARGS__ __VA_OPT__(,) __UNIT__,)
155
156<|
157#define _ONCE_DEFINE_STRONG_I(NAME, ...)
158/*^*/ static void _ONCE_USER(NAME)(void);
159/*^*/ static void (*const _ONCE_ATEXIT_POINTER(NAME))(void);
160/*^*/ static void _ONCE_CALLBACK(NAME)(void) {
161/*^*/ GNU_ATTR_USED [[__maybe_unused__]]
162/*^*/ static char const ONCE_NEW[]
164/*^*/ "\n" _ONCE_DOTTY_NODE(__STRINGIFY__(NAME), shape=box,color=red);
165/*^*/ _ONCE_USER(NAME)();
166/*^*/ if (_ONCE_ATEXIT_POINTER(NAME)) {
167/*^*/ atexit(_ONCE_ATEXIT_POINTER(NAME));
168/*^*/ }
169/*^*/ }
170/*^*/ [[__maybe_unused__]] _ONCE_IS_STRONG bool const _ONCE_STRONG_FLAG(NAME) _ONCE_STRONG_INIT;
171/*^*/ [[__gnu__::__constructor__]]
172/*^*/ void _ONCE_INIT(NAME)(void) {
173/*^*/ static once_flag ONCE_NEW = ONCE_FLAG_INIT;
174/*^*/ call_once(&ONCE(), _ONCE_CALLBACK(NAME));
175/*^*/ }
176/*^*/ static void _ONCE_USER(NAME)(void)
177|>
178
180
181<|
182#define _ONCE_ATEXIT_I(NAME, ...)
183/*^*/ static void _ONCE_ATEXIT_CALLBACK(NAME)(void);
184/*^*/ static void (*const _ONCE_ATEXIT_POINTER(NAME))(void)
185/*^*/ = _ONCE_ATEXIT_CALLBACK(NAME);
186/*^*/ static void _ONCE_ATEXIT_CALLBACK(NAME)(void)
187|>
188
190
191<|
192#define _ONCE_AT_QUICK_EXIT_I(NAME, ...)
193/*^*/ static void _ONCE_AT_QUICK_EXIT_CALLBACK(NAME)(void);
194/*^*/ static void (*const _ONCE_AT_QUICK_EXIT_POINTER(NAME))(void)
195/*^*/ = _ONCE_AT_QUICK_EXIT_CALLBACK(NAME);
196/*^*/ static void _ONCE_AT_QUICK_EXIT_CALLBACK(NAME)(void)
197|>
198
199
221
222
246#define ONCE_DEFINE(...) _ONCE_DEFINE(__VA_ARGS__)
247
269#define ONCE_ATEXIT(...) _ONCE_ATEXIT(__VA_ARGS__)
270
292#define ONCE_AT_QUICK_EXIT(...) _ONCE_AT_QUICK_EXIT(__VA_ARGS__)
293
301#define ONCE_DEPEND_WEAK(...) _ONCE_DEPEND_WEAK(__VA_ARGS__)
302
307#define ONCE_DEFINE_STRONG(...) _ONCE_DEFINE_STRONG(__VA_ARGS__)
308
309#endif
310
__directive__ define
The define directive as specified by the C standard.
Definition directives.c:33
#define GNU_ATTR_USED
Definition ellipsis-error.h:39
#define __STRINGIFY__(...)
Definition ellipsis-error.h:19
#define _ONCE_USER(NAME)
Definition ellipsis-once.h:62
#define _ONCE_ATEXIT_I(NAME,...)
#define _ONCE_DOTTY_FILE
Definition ellipsis-once.h:77
#define _ONCE_DEFINE(...)
Definition ellipsis-once.h:97
#define _ONCE_IS_STRONG
Definition ellipsis-once.h:150
#define _ONCE_ATEXIT_POINTER(NAME)
Definition ellipsis-once.h:64
#define _ONCE_DECLARE(NAME)
#define _ONCE_AT_QUICK_EXIT_POINTER(NAME)
Definition ellipsis-once.h:66
#define _ONCE_DEFINE_I(NAME,...)
#define _ONCE_AT_QUICK_EXIT(...)
Definition ellipsis-once.h:189
#define _ONCE_DOTTY_ARC(A, B)
Definition ellipsis-once.h:70
#define _ONCE_STRONG_INIT
Definition ellipsis-once.h:151
#define _ONCE_ATEXIT(...)
Definition ellipsis-once.h:179
#define _ONCE_DEPEND_WEAK_I(NAME,...)
#define _ONCE_DEPEND_I(NAME,...)
#define _ONCE_DEPEND(...)
Definition ellipsis-once.h:86
#define _ONCE_ATEXIT_CALLBACK(NAME)
Definition ellipsis-once.h:65
#define _ONCE_STRONG_FLAG(NAME)
Definition ellipsis-once.h:68
#define _ONCE_DOTTY_NODE(A,...)
Definition ellipsis-once.h:71
#define _ONCE_CALLBACK(NAME)
Definition ellipsis-once.h:63
#define _ONCE_DEPEND_WEAK(...)
Definition ellipsis-once.h:124
#define ONCE_DEPEND(...)
Declare that this TU depends on a initialization and cleanup feature named NAME
Definition ellipsis-once.h:220
#define _ONCE_AT_QUICK_EXIT_CALLBACK(NAME)
Definition ellipsis-once.h:67
#define _ONCE_AT_QUICK_EXIT_I(NAME,...)
#define _ONCE_INIT(NAME)
Definition ellipsis-once.h:61
#define __VA_OPT__
A pseudo macro that cannot be redefined.
Definition ellipsis-predefined.dirs:89
#define __UNIT__
A pseudo-macro that resolves to the name associated with the current translation unit,...
Definition ellipsis-predefined.dirs:112