From: Lennart Poettering Date: Fri, 29 Aug 2025 21:19:35 +0000 (+0200) Subject: macro: add simple DEFER_VOID_CALL() helper X-Git-Tag: v259-rc1~451^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71f3f1818f0e1cba565c6a7dde2ca1390a31ed6a;p=thirdparty%2Fsystemd.git macro: add simple DEFER_VOID_CALL() helper --- diff --git a/src/basic/macro.h b/src/basic/macro.h index 3ddc5272b85..b53805d5b81 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -206,3 +206,16 @@ static inline size_t size_add(size_t x, size_t y) { for (typeof(entry) _va_sentinel_[1] = {}, _entries_[] = { __VA_ARGS__ __VA_OPT__(,) _va_sentinel_[0] }, *_current_ = _entries_; \ ((long)(_current_ - _entries_) < (long)(ELEMENTSOF(_entries_) - 1)) && ({ entry = *_current_; true; }); \ _current_++) + +typedef void (*void_func_t)(void); + +static inline void dispatch_void_func(void_func_t *f) { + assert(f); + assert(*f); + (*f)(); +} + +/* Inspired by Go's "defer" construct, but much more basic. This basically just calls a void function when + * the current scope is left. Doesn't do function parameters (i.e. no closures). */ +#define DEFER_VOID_CALL(x) _DEFER_VOID_CALL(UNIQ, x) +#define _DEFER_VOID_CALL(uniq, x) _unused_ _cleanup_(dispatch_void_func) void_func_t UNIQ_T(defer, uniq) = (x)