[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