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