[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