[PATCH xserver 1/1] list: Use offsetof() to determine member offsets within a structure
Jeremy Huddleston Sequoia
jeremyhu at apple.com
Tue Aug 28 10:38:08 PDT 2012
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)
+
/**
* 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