Skip to content

Commit cb98c39

Browse files
committed
Add more macros and function in queue
1 parent a57e186 commit cb98c39

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

queue.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#ifndef QUEUE_H
2+
#define QUEUE_H
3+
4+
#if defined(__GNUC__)
5+
#define __QUEUE_HAVE_TYPEOF 1
6+
#endif
7+
8+
/* Merely a doubly-linked list */
9+
struct queue_head {
10+
struct queue_head *prev, *next;
11+
};
12+
13+
#define QUEUE_HEAD(head) struct queue_head head = {&(head), &(head)}
14+
15+
static inline void INIT_QUEUE_HEAD(struct queue_head *head)
16+
{
17+
head->next = head;
18+
head->prev = head;
19+
}
20+
21+
static inline void queue_push(struct queue_head *node, struct queue_head *head)
22+
{
23+
struct queue_head *next = head->next;
24+
25+
next->prev = node;
26+
node->next = next;
27+
28+
node->prev = head;
29+
head->next = node;
30+
}
31+
32+
static inline void queue_pop() {}
33+
34+
#ifndef container_of
35+
#ifdef __QUEUE_HAVE_TYPEOF
36+
#define container_of(ptr, type, member) \
37+
__extension__({ \
38+
const __typeof__(((type *) 0)->member) *__pmember = (ptr); \
39+
(type *) ((char *) __pmember - offsetof(type, member)); \
40+
})
41+
#else
42+
#define container_of(ptr, type, member) \
43+
((type *) ((char *) (ptr) -offsetof(type, member)))
44+
#endif
45+
#endif
46+
47+
#define queue_entry(node, type, member) container_of(node, type, member)
48+
49+
#define queue_first_entry(head, type, member) \
50+
queue_entry((head)->next, type, member)
51+
52+
#define queue_last_entry(head, type, member) \
53+
queue_entry((head)->prev, type, member)
54+
55+
#define list_for_each(node, head) \
56+
for (node = (head)->next; node != (head); node = node->next)
57+
58+
#ifdef __LIST_HAVE_TYPEOF
59+
#define list_for_each_entry(entry, head, member) \
60+
for (entry = list_entry((head)->next, __typeof__(*entry), member); \
61+
&entry->member != (head); \
62+
entry = list_entry(entry->member.next, __typeof__(*entry), member))
63+
#endif
64+
65+
#endif

0 commit comments

Comments
 (0)