File: /usr/src/linux/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
171