/* * 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. */ #ifndef __ASM_QUEUE_H #define __ASM_QUEUE_H #include 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) { if(member) { queue *tail=qhead->tail; 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(1); return(0); } 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(1); *prev=curr; } *prev=NULL; return(0); } 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(1); } return(0); } 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(1); } return(0); } #endif /* __ASM_QUEUE_H */