diff options
Diffstat (limited to 'include/asm-s390x/queue.h')
-rw-r--r-- | include/asm-s390x/queue.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/include/asm-s390x/queue.h b/include/asm-s390x/queue.h new file mode 100644 index 000000000..c817d23b3 --- /dev/null +++ b/include/asm-s390x/queue.h @@ -0,0 +1,170 @@ +/* + * include/asm-s390/queue.h + * + * S390 version + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) + * + * A little set of queue utilies. + */ +#include <linux/stddef.h> +#include <asm/types.h> + +typedef struct queue +{ + struct queue *next; +} queue; + +typedef queue list; + +typedef struct +{ + queue *head; + queue *tail; +} qheader; + +static __inline__ void init_queue(qheader *qhead) +{ + memset(qhead,0,sizeof(*qhead)); +} + +static __inline__ void enqueue_tail(qheader *qhead,queue *member) +{ + queue *tail=qhead->tail; + member->next=NULL; + + if(member) + { + if(tail) + tail->next=member; + else + + qhead->head=member; + qhead->tail=member; + member->next=NULL; + } +} + +static __inline__ queue *dequeue_head(qheader *qhead) +{ + queue *head=qhead->head,*next_head; + + if(head) + { + next_head=head->next; + qhead->head=next_head; + if(!next_head) + qhead->tail=NULL; + } + return(head); +} + +static __inline__ void init_list(list **lhead) +{ + *lhead=NULL; +} + +static __inline__ void add_to_list(list **lhead,list *member) +{ + member->next=*lhead; + *lhead=member; +} + +static __inline__ list *remove_listhead(list **lhead) +{ + list *oldhead=*lhead; + + if(oldhead) + *lhead=(*lhead)->next; + return(oldhead); +} + +static __inline__ void add_to_list_tail(list **lhead,list *member) +{ + list *curr,*prev; + if(*lhead==NULL) + *lhead=member; + else + { + prev=*lhead; + for(curr=(*lhead)->next;curr!=NULL;curr=curr->next) + prev=curr; + prev->next=member; + } +} +static __inline__ void add_to_list_tail_null(list **lhead,list *member) +{ + member->next=NULL; + add_to_list_tail_null(lhead,member); +} + + +static __inline__ int is_in_list(list *lhead,list *member) +{ + list *curr; + + for(curr=lhead;curr!=NULL;curr=curr->next) + if(curr==member) + return(TRUE); + return(FALSE); +} + +static __inline__ int get_prev(list *lhead,list *member,list **prev) +{ + list *curr; + + *prev=NULL; + for(curr=lhead;curr!=NULL;curr=curr->next) + { + if(curr==member) + return(TRUE); + *prev=curr; + } + *prev=NULL; + return(FALSE); +} + + + +static __inline__ int remove_from_list(list **lhead,list *member) +{ + list *prev; + + if(get_prev(*lhead,member,&prev)) + { + + if(prev) + prev->next=member->next; + else + *lhead=member->next; + return(TRUE); + } + return(FALSE); +} + +static __inline__ int remove_from_queue(qheader *qhead,queue *member) +{ + queue *prev; + + if(get_prev(qhead->head,(list *)member,(list **)&prev)) + { + + if(prev) + { + prev->next=member->next; + if(prev->next==NULL) + qhead->tail=prev; + } + else + { + if(qhead->head==qhead->tail) + qhead->tail=NULL; + qhead->head=member->next; + } + return(TRUE); + } + return(FALSE); +} + + + |