diff options
author | Roland McGrath <roland@gnu.org> | 2000-02-04 03:21:18 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2000-02-04 03:21:18 +0000 |
commit | 9fd51e9b0ad33a89a83fdbbb66bd20d85f7893fb (patch) | |
tree | 8845b79f170028cb4380045c50277bbf075b5b7d /pfinet/linux-src/include/linux/lists.h | |
download | hurd-9fd51e9b0ad33a89a83fdbbb66bd20d85f7893fb.tar.gz hurd-9fd51e9b0ad33a89a83fdbbb66bd20d85f7893fb.tar.bz2 hurd-9fd51e9b0ad33a89a83fdbbb66bd20d85f7893fb.zip |
Import of Linux 2.2.12 subset (ipv4 stack and related)
Diffstat (limited to 'pfinet/linux-src/include/linux/lists.h')
-rw-r--r-- | pfinet/linux-src/include/linux/lists.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/pfinet/linux-src/include/linux/lists.h b/pfinet/linux-src/include/linux/lists.h new file mode 100644 index 00000000..6a2240a2 --- /dev/null +++ b/pfinet/linux-src/include/linux/lists.h @@ -0,0 +1,62 @@ +/* + * lists.h: Simple list macros for Linux + */ + +#define DLNODE(ptype) \ + struct { \ + ptype * dl_prev; \ + ptype * dl_next; \ + } + +#define DNODE_SINGLE(node) {(node),(node)} +#define DNODE_NULL {0,0} + +#define DLIST_INIT(listnam) \ + (listnam).dl_prev = &(listnam); \ + (listnam).dl_next = &(listnam); + +#define DLIST_NEXT(listnam) listnam.dl_next +#define DLIST_PREV(listnam) listnam.dl_prev + +#define DLIST_INSERT_AFTER(node, new, listnam) do { \ + (new)->listnam.dl_prev = (node); \ + (new)->listnam.dl_next = (node)->listnam.dl_next; \ + (node)->listnam.dl_next->listnam.dl_prev = (new); \ + (node)->listnam.dl_next = (new); \ + } while (0) + +#define DLIST_INSERT_BEFORE(node, new, listnam) do { \ + (new)->listnam.dl_next = (node); \ + (new)->listnam.dl_prev = (node)->listnam.dl_prev; \ + (node)->listnam.dl_prev->listnam.dl_next = (new); \ + (node)->listnam.dl_prev = (new); \ + } while (0) + +#define DLIST_DELETE(node, listnam) do { \ + node->listnam.dl_prev->listnam.dl_next = \ + node->listnam.dl_next; \ + node->listnam.dl_next->listnam.dl_prev = \ + node->listnam.dl_prev; \ + } while (0) + +/* + * queue-style operations, which have a head and tail + */ + +#define QUEUE_INIT(head, listnam, ptype) \ + (head)->listnam.dl_prev = (head)->listnam.dl_next = (ptype)(head); + +#define QUEUE_FIRST(head, listnam) (head)->DLIST_NEXT(listnam) +#define QUEUE_LAST(head, listnam) (head)->DLIST_PREV(listnam) +#define QUEUE_EMPTY(head, listnam) \ + ((QUEUE_FIRST(head, listnam) == QUEUE_LAST(head, listnam)) && \ + ((u_long)QUEUE_FIRST(head, listnam) == (u_long)head)) + +#define QUEUE_ENTER(head, new, listnam, ptype) do { \ + (new)->listnam.dl_prev = (ptype)(head); \ + (new)->listnam.dl_next = (head)->listnam.dl_next; \ + (head)->listnam.dl_next->listnam.dl_prev = (new); \ + (head)->listnam.dl_next = (new); \ + } while (0) + +#define QUEUE_REMOVE(head, node, listnam) DLIST_DELETE(node, listnam) |