From: Ian Jackson Date: Thu, 14 Sep 2017 17:05:49 +0000 (+0100) Subject: tools: move CONTAINER_OF to xentoolcore_internal.h X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~1154 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=11dd1f6e2da5155f3d2c2b698d57c6c0f34604a6;p=xen.git tools: move CONTAINER_OF to xentoolcore_internal.h Signed-off-by: Ian Jackson Acked-by: Wei Liu --- diff --git a/tools/libs/toolcore/include/xentoolcore_internal.h b/tools/libs/toolcore/include/xentoolcore_internal.h index 670e29dd29..27497d6ecc 100644 --- a/tools/libs/toolcore/include/xentoolcore_internal.h +++ b/tools/libs/toolcore/include/xentoolcore_internal.h @@ -24,6 +24,8 @@ #ifndef XENTOOLCORE_INTERNAL_H #define XENTOOLCORE_INTERNAL_H +#include + #include "xentoolcore.h" #include "_xentoolcore_list.h" @@ -89,6 +91,46 @@ struct Xentoolcore__Active_Handle { void xentoolcore__register_active_handle(Xentoolcore__Active_Handle*); void xentoolcore__deregister_active_handle(Xentoolcore__Active_Handle*); +/* ---------- convenient stuff ---------- */ + +/* + * This does not appear in xentoolcore.h because it is a bit + * namespace-unclean. + */ + +/* + * Convenience macros. + */ + +/* + * CONTAINER_OF work like this. Given: + * typedef struct { + * ... + * member_type member_name; + * ... + * } outer_type; + * outer_type outer, *outer_var; + * member_type *inner_ptr = &outer->member_name; + * + * Then, effectively: + * outer_type *CONTAINER_OF(member_type *inner_ptr, + * *outer_var, // or type name for outer_type + * member_name); + * + * So that: + * CONTAINER_OF(inner_ptr, *outer_var, member_name) == &outer + * CONTAINER_OF(inner_ptr, outer_type, member_name) == &outer + */ +#define CONTAINER_OF(inner_ptr, outer, member_name) \ + ({ \ + typeof(outer) *container_of_; \ + container_of_ = (void*)((char*)(inner_ptr) - \ + offsetof(typeof(outer), member_name)); \ + (void)(&container_of_->member_name == \ + (typeof(inner_ptr))0) /* type check */; \ + container_of_; \ + }) + #endif /* XENTOOLCORE_INTERNAL_H */ /* diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index a6a97131ad..dfb812c81e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3851,36 +3851,6 @@ _hidden void libxl__remus_restore_setup(libxl__egc *egc, * Convenience macros. */ -/* - * CONTAINER_OF work like this. Given: - * typedef struct { - * ... - * member_type member_name; - * ... - * } outer_type; - * outer_type outer, *outer_var; - * member_type *inner_ptr = &outer->member_name; - * - * Then, effectively: - * outer_type *CONTAINER_OF(member_type *inner_ptr, - * *outer_var, // or type name for outer_type - * member_name); - * - * So that: - * CONTAINER_OF(inner_ptr, *outer_var, member_name) == &outer - * CONTAINER_OF(inner_ptr, outer_type, member_name) == &outer - */ -#define CONTAINER_OF(inner_ptr, outer, member_name) \ - ({ \ - typeof(outer) *container_of_; \ - container_of_ = (void*)((char*)(inner_ptr) - \ - offsetof(typeof(outer), member_name)); \ - (void)(&container_of_->member_name == \ - (typeof(inner_ptr))0) /* type check */; \ - container_of_; \ - }) - - #define FILLZERO LIBXL_FILLZERO