[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 06/22] tools: move CONTAINER_OF to xentoolcore_internal.h
Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- tools/libs/toolcore/include/xentoolcore_internal.h | 42 ++++++++++++++++++++++ tools/libxl/libxl_internal.h | 30 ---------------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/tools/libs/toolcore/include/xentoolcore_internal.h b/tools/libs/toolcore/include/xentoolcore_internal.h index 670e29d..27497d6 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 <stddef.h> + #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 04be10a..4f2f433 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3804,36 +3804,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 -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |