Merge remote-tracking branch 'jeremyhu/master'

This commit is contained in:
Keith Packard 2012-09-05 11:02:58 -07:00
commit 856f80c8d7
4 changed files with 23 additions and 6 deletions

View File

@ -137,6 +137,7 @@ AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h stropts.h fnmatch.h
dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST AC_C_CONST
AC_C_TYPEOF
AC_C_BIGENDIAN([ENDIAN="X_BIG_ENDIAN"], [ENDIAN="X_LITTLE_ENDIAN"]) AC_C_BIGENDIAN([ENDIAN="X_BIG_ENDIAN"], [ENDIAN="X_LITTLE_ENDIAN"])
AC_CHECK_SIZEOF([unsigned long]) AC_CHECK_SIZEOF([unsigned long])

View File

@ -423,6 +423,9 @@
/* Define to 64-bit byteswap macro */ /* Define to 64-bit byteswap macro */
#undef bswap_64 #undef bswap_64
/* Define to 1 if typeof works with your compiler. */
#undef HAVE_TYPEOF
/* The compiler supported TLS storage class, prefering initial-exec if tls_model is supported */ /* The compiler supported TLS storage class, prefering initial-exec if tls_model is supported */
#undef TLS #undef TLS

View File

@ -26,6 +26,8 @@
#ifndef _XORG_LIST_H_ #ifndef _XORG_LIST_H_
#define _XORG_LIST_H_ #define _XORG_LIST_H_
#include <stddef.h> /* offsetof() */
/** /**
* @file Classic doubly-link circular list implementation. * @file Classic doubly-link circular list implementation.
* For real usage examples of the linked list, see the file test/list.c * 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 #ifndef container_of
#define container_of(ptr, type, member) \ #define container_of(ptr, type, member) \
(type *)((char *)(ptr) - (char *) &((type *)0)->member) (type *)((char *)(ptr) - offsetof(type, member))
#endif #endif
/** /**
@ -271,9 +273,20 @@ xorg_list_is_empty(struct xorg_list *head)
#define xorg_list_last_entry(ptr, type, member) \ #define xorg_list_last_entry(ptr, type, member) \
xorg_list_entry((ptr)->prev, type, member) xorg_list_entry((ptr)->prev, type, member)
#define __container_of(ptr, sample, member) \ #ifdef HAVE_TYPEOF
(void *)((char *)(ptr) \ #define __container_of(ptr, sample, member) \
- ((char *)&(sample)->member - (char *)(sample))) container_of(ptr, typeof(*sample), member)
#else
/* This implementation of __container_of has undefined behavior according
* to the C standard, but it works in many cases. If your compiler doesn't
* support typeof() and fails with this implementation, please try a newer
* compiler.
*/
#define __container_of(ptr, sample, member) \
(void *)((char *)(ptr) \
- ((char *)&(sample)->member - (char *)(sample)))
#endif
/** /**
* Loop through the list given by head and set pos to struct in the list. * Loop through the list given by head and set pos to struct in the list.
* *

View File

@ -137,7 +137,7 @@ static void
test_xorg_list_del(void) test_xorg_list_del(void)
{ {
struct parent parent = { 0 }; struct parent parent = { 0 };
struct child child[3]; struct child child[2];
struct child *c; struct child *c;
xorg_list_init(&parent.children); xorg_list_init(&parent.children);
@ -178,8 +178,8 @@ test_xorg_list_del(void)
xorg_list_add(&child[0].node, &parent.children); xorg_list_add(&child[0].node, &parent.children);
xorg_list_del(&parent.children); xorg_list_del(&parent.children);
assert(xorg_list_is_empty(&parent.children)); assert(xorg_list_is_empty(&parent.children));
assert(!xorg_list_is_empty(&child[0].node));
assert(!xorg_list_is_empty(&child[1].node)); assert(!xorg_list_is_empty(&child[1].node));
assert(!xorg_list_is_empty(&child[2].node));
} }
static void static void