From 867d50eea7fc8be4e286ae751b75dcb4f27df99e Mon Sep 17 00:00:00 2001 From: Jon Cruz Date: Mon, 15 Jun 2015 15:37:10 -0700 Subject: Unified multiple definitions of container_of() macro. Removed duplicate definitions of the container_of() macro and refactored sources to use the single implementation. Signed-off-by: Jon A. Cruz Reviewed-by: Peter Hutterer Reviewed-by: Bryce Harrington --- shared/config-parser.c | 5 +---- shared/helpers.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) (limited to 'shared') diff --git a/shared/config-parser.c b/shared/config-parser.c index 4174836d..a50773ba 100644 --- a/shared/config-parser.c +++ b/shared/config-parser.c @@ -39,10 +39,7 @@ #include #include "config-parser.h" - -#define container_of(ptr, type, member) ({ \ - const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) +#include "helpers.h" struct weston_config_entry { char *key; diff --git a/shared/helpers.h b/shared/helpers.h index 83f79b11..1d1e4589 100644 --- a/shared/helpers.h +++ b/shared/helpers.h @@ -52,6 +52,43 @@ extern "C" { #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #endif +/** + * Returns a pointer the the containing struct of a given member item. + * + * To demonstrate, the following example retrieves a pointer to + * `example_container` given only its `destroy_listener` member: + * + * @code + * struct example_container { + * struct wl_listener destroy_listener; + * // other members... + * }; + * + * void example_container_destroy(struct wl_listener *listener, void *data) + * { + * struct example_container *ctr; + * + * ctr = wl_container_of(listener, ctr, destroy_listener); + * // destroy ctr... + * } + * @endcode + * + * @param ptr A valid pointer to the contained item. + * + * @param type A pointer to the type of content that the list item + * stores. Type does not need be a valid pointer; a null or + * an uninitialised pointer will suffice. + * + * @param member The named location of ptr within the sample type. + * + * @return The container for the specified pointer. + */ +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +#endif + #ifdef __cplusplus } #endif -- cgit v1.2.1