--- configure.ac | 3 +++ src/util/list.h | 9 +++++++++ 2 files changed, 12 insertions(+)
diff --git a/configure.ac b/configure.ac index a6ceee95a3..87f635c1a3 100644 --- a/configure.ac +++ b/configure.ac @@ -415,6 +415,9 @@ AC_C_BIGENDIAN( little_endian=no ) +dnl Chek for typeof support +AC_C_TYPEOF() + dnl Check for POWER8 Architecture PWR8_CFLAGS="-mpower8-vector" have_pwr8_intrinsics=no diff --git a/src/util/list.h b/src/util/list.h index 07eb9f3e6a..eaaac43fec 100644 --- a/src/util/list.h +++ b/src/util/list.h @@ -171,10 +171,19 @@ static inline void list_validate(struct list_head *list) * 'sample' MUST be initialized, or else the result is undefined! */ #ifndef container_of +#if HAVE_TYPEOF +#define container_of_typed(ptr, type, member) ({ \ + const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#define container_of(ptr, sample, member) \ + container_of_typed(ptr, __typeof__(*sample), member) +#else #define container_of(ptr, sample, member) \ (void *)((char *)(ptr) \ - ((char *)&(sample)->member - (char *)(sample))) #endif +#endif #define list_first_entry(ptr, type, member) \ LIST_ENTRY(type, (ptr)->next, member) -- 2.11.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev