ia64/xen-unstable

view tools/blktap/list.h @ 7238:971e7c7411b3

Raise an exception if an error appears on the pipes to our children, and make
sure that the child's pipes are closed even under that exception. Move the
handling of POLLHUP to the end of the loop, so that we guarantee to read any
remaining data from the child if POLLHUP and POLLIN appear at the same time.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
author emellor@ewan
date Thu Oct 06 10:13:11 2005 +0100 (2005-10-06)
parents 06d84bf87159
children
line source
1 /*
2 * list.h
3 *
4 * This is a subset of linux's list.h intended to be used in user-space.
5 *
6 */
8 #ifndef __LIST_H__
9 #define __LIST_H__
11 #define LIST_POISON1 ((void *) 0x00100100)
12 #define LIST_POISON2 ((void *) 0x00200200)
14 struct list_head {
15 struct list_head *next, *prev;
16 };
18 #define LIST_HEAD_INIT(name) { &(name), &(name) }
20 #define LIST_HEAD(name) \
21 struct list_head name = LIST_HEAD_INIT(name)
23 static inline void __list_add(struct list_head *new,
24 struct list_head *prev,
25 struct list_head *next)
26 {
27 next->prev = new;
28 new->next = next;
29 new->prev = prev;
30 prev->next = new;
31 }
33 static inline void list_add(struct list_head *new, struct list_head *head)
34 {
35 __list_add(new, head, head->next);
36 }
37 static inline void __list_del(struct list_head * prev, struct list_head * next)
38 {
39 next->prev = prev;
40 prev->next = next;
41 }
42 static inline void list_del(struct list_head *entry)
43 {
44 __list_del(entry->prev, entry->next);
45 entry->next = LIST_POISON1;
46 entry->prev = LIST_POISON2;
47 }
48 #define list_entry(ptr, type, member) \
49 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
50 #define list_for_each_entry(pos, head, member) \
51 for (pos = list_entry((head)->next, typeof(*pos), member); \
52 &pos->member != (head); \
53 pos = list_entry(pos->member.next, typeof(*pos), member))
55 #endif /* __LIST_H__ */