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 <[email protected]>

> ---
>  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
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to