source: cmedia/trunk/Include/Linux/list.h

Last change on this file was 354, checked in by stevenhl, 17 years ago

Import untested baseline cmedia sources, work products and binaries
Binaries and work products should be deleted from repository.
once new builds are verified to work.

File size: 2.6 KB
Line 
1/* $Id: list.h,v 1.1 2000/04/23 14:55:31 ktk Exp $ */
2
3#ifndef _LINUX_LIST_H
4#define _LINUX_LIST_H
5
6#ifdef __KERNEL__
7
8/*
9 * Simple doubly linked list implementation.
10 *
11 * Some of the internal functions ("__xxx") are useful when
12 * manipulating whole lists rather than single entries, as
13 * sometimes we already know the next/prev entries and we can
14 * generate better code by using them directly rather than
15 * using the generic single-entry routines.
16 */
17
18struct list_head {
19 struct list_head *next, *prev;
20};
21
22#define LIST_HEAD_INIT(name) { &(name), &(name) }
23
24#define LIST_HEAD(name) \
25 struct list_head name = LIST_HEAD_INIT(name)
26
27#define INIT_LIST_HEAD(ptr) do { \
28 (ptr)->next = (ptr); (ptr)->prev = (ptr); \
29} while (0)
30
31/*
32 * Insert a new entry between two known consecutive entries.
33 *
34 * This is only for internal list manipulation where we know
35 * the prev/next entries already!
36 */
37static __inline__ void __list_add(struct list_head * new,
38 struct list_head * prev,
39 struct list_head * next)
40{
41 next->prev = new;
42 new->next = next;
43 new->prev = prev;
44 prev->next = new;
45}
46
47/*
48 * Insert a new entry after the specified head..
49 */
50static __inline__ void list_add(struct list_head *new, struct list_head *head)
51{
52 __list_add(new, head, head->next);
53}
54
55/*
56 * Insert a new entry before the specified head..
57 */
58static __inline__ void list_add_tail(struct list_head *new, struct list_head *head)
59{
60 __list_add(new, head->prev, head);
61}
62
63/*
64 * Delete a list entry by making the prev/next entries
65 * point to each other.
66 *
67 * This is only for internal list manipulation where we know
68 * the prev/next entries already!
69 */
70static __inline__ void __list_del(struct list_head * prev,
71 struct list_head * next)
72{
73 next->prev = prev;
74 prev->next = next;
75}
76
77static __inline__ void list_del(struct list_head *entry)
78{
79 __list_del(entry->prev, entry->next);
80}
81
82static __inline__ int list_empty(struct list_head *head)
83{
84 return head->next == head;
85}
86
87/*
88 * Splice in "list" into "head"
89 */
90static __inline__ void list_splice(struct list_head *list, struct list_head *head)
91{
92 struct list_head *first = list->next;
93
94 if (first != list) {
95 struct list_head *last = list->prev;
96 struct list_head *at = head->next;
97
98 first->prev = head;
99 head->next = first;
100
101 last->next = at;
102 at->prev = last;
103 }
104}
105
106#define list_entry(ptr, type, member) \
107 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
108
109#define list_for_each(entry, listhead) \
110 for(entry=(listhead)->next;entry != listhead;entry=entry->next)
111
112#endif /* __KERNEL__ */
113
114#endif
Note: See TracBrowser for help on using the repository browser.