Viewing file: queue.h (2.63 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* * 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 <linux/stddef.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) { 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 */
|