[PATCH xserver 1/1] list: Use offsetof() to determine member offsets within a structure
Mark Kettenis
mark.kettenis at xs4all.nl
Wed Aug 29 01:00:51 PDT 2012
> Date: Wed, 29 Aug 2012 16:35:50 +1000
> From: Peter Hutterer <peter.hutterer at who-t.net>
>
> 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?
It's a GCC extension and no present in C99.
More information about the xorg-devel
mailing list