-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathqueue.h
More file actions
50 lines (40 loc) · 1.48 KB
/
queue.h
File metadata and controls
50 lines (40 loc) · 1.48 KB
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
/*Karthick:A generic queue*/
#ifndef _QUEUE_H
#define _QUEUE_H
struct queue_struct {
struct queue_struct *next;
struct queue_struct **pprev;
};
#define QUEUE_INIT(queue) ( (queue)->head = NULL,(queue)->tail = &(queue)->head )
#define QUEUE_EMPTY(queue) ( (queue)->head == NULL )
#define QUEUE_ADD(element,queue) do { \
if( (queue) && (element) ) { \
if(((element)->next = (queue)->head)) {\
(element)->next->pprev = &(element)->next;\
} else (queue)->tail = &(element)->next;\
*((element)->pprev = &(queue)->head) = (element);\
}\
}while(0)
#define QUEUE_ADD_TAIL(element,queue) do { \
if((queue) && (element)) { \
(element)->next = NULL;\
*((element)->pprev = (queue)->tail) = (element);\
(queue)->tail = &(element)->next;\
}\
}while(0)
#define QUEUE_DEL(element,queue) do { \
if((queue) && (element) && (element)->pprev) { \
if((element)->next) {\
(element)->next->pprev = (element)->pprev;\
} else (queue)->tail = (element)->pprev;\
*((element)->pprev) = (element)->next;\
(element)->pprev = NULL,(element)->next = NULL;\
}\
}while(0)
#define queue_entry(queue,cast,field) \
(cast*) ( (unsigned char *)(queue) - (unsigned long)&((cast*)0)->field)
#define queue_for_each(element,queue) \
for(element = (queue)->head ; element; element = element->next)
#define queue_for_each_safe(element,temp,queue) \
for(element = (queue)->head ,temp = element?element->next:NULL; element;element=temp,temp=element?element->next:NULL)
#endif