[PATCH xserver 1/1] list: Use offsetof() to determine member offsets within a structure
Peter Hutterer
peter.hutterer at who-t.net
Tue Aug 28 23:35:50 PDT 2012
On Tue, Aug 28, 2012 at 10:38:08AM -0700, Jeremy Huddleston Sequoia wrote:
> Some compilers have difficulty with the previous implementation which
> relies on undefined behavior according to the C standard. Using
> offsetof() from <stddef.h> (which most likely just uses
> __builtin_offsetof on modern compilers) allows us to accomplish this
> without ambiguity.
>
> Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
> ---
> include/list.h | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/include/list.h b/include/list.h
> index d54a207..ae5431c 100644
> --- a/include/list.h
> +++ b/include/list.h
> @@ -26,6 +26,8 @@
> #ifndef _XORG_LIST_H_
> #define _XORG_LIST_H_
>
> +#include <stddef.h> /* offsetof() */
> +
> /**
> * @file Classic doubly-link circular list implementation.
> * For real usage examples of the linked list, see the file test/list.c
> @@ -232,7 +234,7 @@ xorg_list_is_empty(struct xorg_list *head)
> */
> #ifndef container_of
> #define container_of(ptr, type, member) \
> - (type *)((char *)(ptr) - (char *) &((type *)0)->member)
> + (type *)((char *)(ptr) - (char *) offsetof(type, member))
> #endif
>
> /**
> @@ -271,9 +273,9 @@ xorg_list_is_empty(struct xorg_list *head)
> #define xorg_list_last_entry(ptr, type, member) \
> xorg_list_entry((ptr)->prev, type, member)
>
> -#define __container_of(ptr, sample, member) \
> - (void *)((char *)(ptr) \
> - - ((char *)&(sample)->member - (char *)(sample)))
> +#define __container_of(ptr, sample, member) \
> + container_of(ptr, typeof(*sample), member)
typeof is a gcc extension/c99 and I don't think we support that yet, do we?
Cheers,
Peter
> +
> /**
> * Loop through the list given by head and set pos to struct in the list.
> *
> --
> 1.7.11.5
More information about the xorg-devel
mailing list