[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 12/10] libxl: New convenience macro CONTAINING_STRUCT
Provide a convenient and type-safe wrapper which does the correct dance to subtract offsetof. Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- tools/libxl/libxl_internal.h | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e0ff15c..e0c2ad6 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1224,6 +1224,41 @@ _hidden void libxl__ao__destroy(libxl_ctx*, libxl__ao *ao); * Convenience macros. */ +/* + * [GET_]CONTAINING_STRUCT work like this. Given: + * typedef struct { + * ... + * member_type member_name; + * ... + * } outer_type; + * Then: + * void GET_CONTAINING_STRUCT(outer_type *outer_var [NB:UPDATED], + * some_type *inner_ptr, + * member_name); + * outer_type *CONTAINING_STRUCT(outer_type, + * some_type *inner_ptr, + * member_name); + * The semantics are that after: + * outer_type outer, *outer_var; + * member_type *inner_ptr = &outer->member_name; + * GET_CONTAINING_STRUCT(outer_var, &outer_ptr->member_name, member_name) + * The following hold: + * CONTAINING_STRUCT(inner_ptr, outer_type, member_name) == outer_ptr + * outer_var == &outer + */ +#define GET_CONTAINING_STRUCT(outer_var, inner_ptr, member_name) \ + ((outer_var) = (void*)((char*)(inner_ptr) - \ + offsetof(typeof(*(outer_var)), member_name)), \ + (void)(&(outer_var)->member_name == \ + (typeof(inner_ptr))0) /* type check */, \ + (void)0) +#define CONTAINING_STRUCT(outer_type, inner_ptr, member_name) \ + ({ \ + typeof(outer_type) *containing_struct; \ + GET_CONTAINING_STRUCT(containing_struct, inner_ptr, member_name); \ + containing_struct; \ + }) + /* * All of these assume (or define) -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |