From 9e93251397788b73728afcf44372127de7b26332 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 22 Jan 2014 16:55:27 +0100 Subject: [PATCH] utils: Provide a CALLBACK macro, similar to METHOD, but for void* callbacks Using the same mechanism as the METHOD macro, the CALLBACK macro defines a hybrid function signature. It strictly uses a weak void* for the first function parameter, in contrast to the dynamic METHOD object "this" type. --- src/libstrongswan/utils/utils.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/libstrongswan/utils/utils.h b/src/libstrongswan/utils/utils.h index 75b31ec1b..53bfceda6 100644 --- a/src/libstrongswan/utils/utils.h +++ b/src/libstrongswan/utils/utils.h @@ -203,6 +203,19 @@ static inline bool memeq(const void *x, const void *y, size_t len) static typeof(name) *_##name = (typeof(name)*)name; \ static ret name(this, ##__VA_ARGS__) +/** + * Callback declaration/definition macro, allowing casted first parameter. + * + * This is very similar to METHOD, but instead of casting the first parameter + * to a public interface, it uses a void*. This allows type safe definition + * of a callback function, while using the real type for the first parameter. + */ +#define CALLBACK(name, ret, param1, ...) \ + static ret _cb_##name(union {void *_generic; param1;} \ + __attribute__((transparent_union)), ##__VA_ARGS__); \ + static typeof(_cb_##name) *name = (typeof(_cb_##name)*)_cb_##name; \ + static ret _cb_##name(param1, ##__VA_ARGS__) + /** * Architecture independent bitfield definition helpers (at least with GCC). *