summaryrefslogtreecommitdiffstats
path: root/include/asm-s390/queue.h
blob: 9771d3048772e74df26e7856447126d7e4edc8d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 *  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__ 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);
}