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 14typedef struct queue 15{ 16 struct queue *next; 17} queue; 18 19typedef queue list; 20 21typedef struct 22{ 23 queue *head; 24 queue *tail; 25} qheader; 26 27static __inline__ void init_queue(qheader *qhead) 28{ 29 memset(qhead,0,sizeof(*qhead)); 30} 31 32static __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 48static __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 62static __inline__ void init_list(list **lhead) 63{ 64 *lhead=NULL; 65} 66 67static __inline__ void add_to_list(list **lhead,list *member) 68{ 69 member->next=*lhead; 70 *lhead=member; 71} 72 73static __inline__ list *remove_listhead(list **lhead) 74{ 75 list *oldhead=*lhead; 76 77 if(oldhead) 78 *lhead=(*lhead)->next; 79 return(oldhead); 80} 81 82static __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} 95static __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 102static __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 112static __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 129static __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 145static __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