]> git.ipfire.org Git - thirdparty/squid.git/blob - src/dlink.cc
merge from trunk r12441
[thirdparty/squid.git] / src / dlink.cc
1 #include "squid.h"
2 #include "dlink.h"
3
4 /* dlink are Mem-pooled */
5 #include "MemPool.h"
6
7 dlink_list ClientActiveRequests;
8
9 MemAllocator *dlink_node_pool = NULL;
10
11 dlink_node *
12 dlinkNodeNew()
13 {
14 if (dlink_node_pool == NULL)
15 dlink_node_pool = memPoolCreate("Dlink list nodes", sizeof(dlink_node));
16
17 /* where should we call delete dlink_node_pool;dlink_node_pool = NULL; */
18 return (dlink_node *)dlink_node_pool->alloc();
19 }
20
21 /** The node needs to be unlinked FIRST */
22 void
23 dlinkNodeDelete(dlink_node * m)
24 {
25 if (m == NULL)
26 return;
27
28 dlink_node_pool->freeOne(m);
29 }
30
31 void
32 dlinkAdd(void *data, dlink_node * m, dlink_list * list)
33 {
34 m->data = data;
35 m->prev = NULL;
36 m->next = list->head;
37
38 if (list->head)
39 list->head->prev = m;
40
41 list->head = m;
42
43 if (list->tail == NULL)
44 list->tail = m;
45 }
46
47 void
48 dlinkAddAfter(void *data, dlink_node * m, dlink_node * n, dlink_list * list)
49 {
50 m->data = data;
51 m->prev = n;
52 m->next = n->next;
53
54 if (n->next)
55 n->next->prev = m;
56 else {
57 assert(list->tail == n);
58 list->tail = m;
59 }
60
61 n->next = m;
62 }
63
64 void
65 dlinkAddTail(void *data, dlink_node * m, dlink_list * list)
66 {
67 m->data = data;
68 m->next = NULL;
69 m->prev = list->tail;
70
71 if (list->tail)
72 list->tail->next = m;
73
74 list->tail = m;
75
76 if (list->head == NULL)
77 list->head = m;
78 }
79
80 void
81 dlinkDelete(dlink_node * m, dlink_list * list)
82 {
83 if (m->next)
84 m->next->prev = m->prev;
85
86 if (m->prev)
87 m->prev->next = m->next;
88
89 if (m == list->head)
90 list->head = m->next;
91
92 if (m == list->tail)
93 list->tail = m->prev;
94
95 m->next = m->prev = NULL;
96 }