cleanup
[linux-2.4.git] / include / asm-s390x / queue.h
1 /*
2  *  include/asm-s390/queue.h
3  *
4  *  S390 version
5  *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
6  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
7  *
8  *  A little set of queue utilies.
9  */
10 #ifndef __ASM_QUEUE_H
11 #define __ASM_QUEUE_H
12 #include <linux/stddef.h>
13
14 typedef struct queue
15 {
16         struct queue *next;     
17 } queue;
18
19 typedef queue list;
20
21 typedef struct
22 {
23         queue *head;
24         queue *tail;
25 } qheader;
26
27 static __inline__ void init_queue(qheader *qhead)
28 {
29         memset(qhead,0,sizeof(*qhead));
30 }
31
32 static __inline__ void enqueue_tail(qheader *qhead,queue *member)
33 {       
34         if(member)
35         {
36                 queue *tail=qhead->tail;
37
38                 if(tail)
39                         tail->next=member;
40                 else
41                         
42                         qhead->head=member;
43                 qhead->tail=member;
44                 member->next=NULL;
45         }
46
47
48 static __inline__ queue *dequeue_head(qheader *qhead)
49 {
50         queue *head=qhead->head,*next_head;
51
52         if(head)
53         {
54                 next_head=head->next;
55                 qhead->head=next_head;
56                 if(!next_head)
57                         qhead->tail=NULL;
58         }
59         return(head);
60 }
61
62 static __inline__ void init_list(list **lhead)
63 {
64         *lhead=NULL;
65 }
66
67 static __inline__ void add_to_list(list **lhead,list *member)
68 {
69         member->next=*lhead;
70         *lhead=member;
71 }
72
73 static __inline__ list *remove_listhead(list **lhead)
74 {
75         list *oldhead=*lhead;
76
77         if(oldhead)
78                 *lhead=(*lhead)->next;
79         return(oldhead);
80 }
81
82 static __inline__ void add_to_list_tail(list **lhead,list *member)
83 {
84         list *curr,*prev;
85         if(*lhead==NULL)
86                 *lhead=member;
87         else
88         {
89                 prev=*lhead;
90                 for(curr=(*lhead)->next;curr!=NULL;curr=curr->next)
91                         prev=curr;
92                 prev->next=member;
93         }
94 }
95 static __inline__ void add_to_list_tail_null(list **lhead,list *member)
96 {
97         member->next=NULL;
98         add_to_list_tail_null(lhead,member);
99 }
100
101
102 static __inline__ int is_in_list(list *lhead,list *member)
103 {
104         list *curr;
105
106         for(curr=lhead;curr!=NULL;curr=curr->next)
107                 if(curr==member)
108                         return(1);
109         return(0);
110 }
111
112 static __inline__ int get_prev(list *lhead,list *member,list **prev)
113 {
114         list *curr;
115
116         *prev=NULL;
117         for(curr=lhead;curr!=NULL;curr=curr->next)
118         {
119                 if(curr==member)
120                         return(1);
121                 *prev=curr;
122         }
123         *prev=NULL;
124         return(0);
125 }
126
127
128
129 static __inline__ int remove_from_list(list **lhead,list *member)
130 {
131         list *prev;
132
133         if(get_prev(*lhead,member,&prev))
134         {
135
136                 if(prev)
137                         prev->next=member->next;
138                 else
139                         *lhead=member->next;
140                 return(1);
141         }
142         return(0);
143 }
144
145 static __inline__ int remove_from_queue(qheader *qhead,queue *member)
146 {
147         queue *prev;
148
149         if(get_prev(qhead->head,(list *)member,(list **)&prev))
150         {
151
152                 if(prev)
153                 {
154                         prev->next=member->next;
155                         if(prev->next==NULL)
156                                 qhead->tail=prev;
157                 }
158                 else
159                 {
160                         if(qhead->head==qhead->tail)
161                                 qhead->tail=NULL;
162                         qhead->head=member->next;
163                 }
164                 return(1);
165         }
166         return(0);
167 }
168
169 #endif /* __ASM_QUEUE_H */
170