Zephyr API Documentation
4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
cleanup.h
Go to the documentation of this file.
1
5
6
#ifndef ZEPHYR_INCLUDE_CLEANUP_H_
7
#define ZEPHYR_INCLUDE_CLEANUP_H_
8
9
#include <
zephyr/toolchain.h
>
10
15
21
22
#if defined(CONFIG_SCOPE_CLEANUP_HELPERS) || defined(__DOXYGEN__)
23
85
#define SCOPE_VAR_DEFINE(_name, _type, _exit_fn, _init_fn, ...) \
86
static inline void __maybe_unused cleanup_##_name##_exit(_type *p) \
87
{ \
88
_type _T = *p; \
89
_exit_fn; \
90
} \
91
static inline _type __maybe_unused cleanup_##_name##_init(__VA_ARGS__) \
92
{ \
93
_type t = _init_fn; \
94
return t; \
95
} \
96
typedef _type cleanup_##_name##_t
97
118
#define SCOPE_GUARD_DEFINE(_name, _type, _lock, _unlock) \
119
SCOPE_VAR_DEFINE( \
120
guard_##_name, _type, if (_T != NULL) { _unlock; }, ({ \
121
_lock; \
122
_T; \
123
}), \
124
_type _T)
125
127
128
#define Z_SCOPE_DEFER_DEFINE_VOID(_func) \
129
SCOPE_VAR_DEFINE(defer_##_func, void *, (void)_T; (void)_func(), NULL, void)
130
131
#define Z_DEFER_CTX_ARG(idx, t) t arg##idx;
132
#define Z_DEFER_FUNC_ARG(idx, t) t arg##idx
133
#define Z_DEFER_INIT_ARG(idx, _) .arg##idx = arg##idx
134
#define Z_DEFER_EXIT_ARG(idx, _) _T.arg##idx
135
#define Z_COMMA ,
136
137
#define Z_SCOPE_DEFER_DEFINE_N(_func, ...) \
138
struct defer_##_func##_ctx { \
139
FOR_EACH_IDX(Z_DEFER_CTX_ARG, (), __VA_ARGS__) \
140
}; \
141
SCOPE_VAR_DEFINE(defer_##_func, struct defer_##_func##_ctx, \
142
(void)_func(FOR_EACH_IDX(Z_DEFER_EXIT_ARG, (Z_COMMA), __VA_ARGS__)), \
143
{FOR_EACH_IDX(Z_DEFER_INIT_ARG, (Z_COMMA), __VA_ARGS__)}, \
144
FOR_EACH_IDX(Z_DEFER_FUNC_ARG, (Z_COMMA), __VA_ARGS__))
145
147
164
#define SCOPE_DEFER_DEFINE(_func, ...) \
165
COND_CODE_0(NUM_VA_ARGS(__VA_ARGS__), \
166
(Z_SCOPE_DEFER_DEFINE_VOID(_func)), \
167
(Z_SCOPE_DEFER_DEFINE_N(_func, __VA_ARGS__)))
168
170
176
#define Z_UNIQUE_ID(_prefix) _CONCAT(_CONCAT(Z_UNIQUE_ID_, _prefix), __COUNTER__)
177
179
199
#define scope_var(_name, _var) \
200
cleanup_##_name##_t _var __cleanup(cleanup_##_name##_exit) = cleanup_##_name##_init
201
224
#define scope_var_init(_name, _var, _init_expr) \
225
cleanup_##_name##_t _var __cleanup(cleanup_##_name##_exit) = (_init_expr)
226
240
#define scope_guard(_name) scope_var(guard_##_name, Z_UNIQUE_ID(guard))
241
255
#define scope_defer(_name) scope_var(defer_##_name, Z_UNIQUE_ID(defer))
256
260
261
#endif
/* defined(CONFIG_SCOPE_CLEANUP_HELPERS) || defined(__DOXYGEN__) */
262
263
#endif
/* ZEPHYR_INCLUDE_CLEANUP_H_ */
toolchain.h
Macros to abstract toolchain specific capabilities.
zephyr
cleanup.h
Generated on
for Zephyr API Documentation by
1.15.0