/src/ruby/ccan/list/list.h
Line | Count | Source |
1 | | /* Licensed under BSD-MIT - see ccan/licenses/BSD-MIT file for details */ |
2 | | #ifndef CCAN_LIST_H |
3 | | #define CCAN_LIST_H |
4 | | #include <assert.h> |
5 | | #include "ccan/str/str.h" |
6 | | #include "ccan/container_of/container_of.h" |
7 | | #include "ccan/check_type/check_type.h" |
8 | | |
9 | | /** |
10 | | * struct ccan_list_node - an entry in a doubly-linked list |
11 | | * @next: next entry (self if empty) |
12 | | * @prev: previous entry (self if empty) |
13 | | * |
14 | | * This is used as an entry in a linked list. |
15 | | * Example: |
16 | | * struct child { |
17 | | * const char *name; |
18 | | * // Linked list of all us children. |
19 | | * struct ccan_list_node list; |
20 | | * }; |
21 | | */ |
22 | | struct ccan_list_node |
23 | | { |
24 | | struct ccan_list_node *next, *prev; |
25 | | }; |
26 | | |
27 | | /** |
28 | | * struct ccan_list_head - the head of a doubly-linked list |
29 | | * @h: the ccan_list_head (containing next and prev pointers) |
30 | | * |
31 | | * This is used as the head of a linked list. |
32 | | * Example: |
33 | | * struct parent { |
34 | | * const char *name; |
35 | | * struct ccan_list_head children; |
36 | | * unsigned int num_children; |
37 | | * }; |
38 | | */ |
39 | | struct ccan_list_head |
40 | | { |
41 | | struct ccan_list_node n; |
42 | | }; |
43 | | |
44 | 294k | #define CCAN_LIST_LOC __FILE__ ":" ccan_stringify(__LINE__) |
45 | 1.27M | #define ccan_list_debug(h, loc) ((void)loc, h) |
46 | 10.7k | #define ccan_list_debug_node(n, loc) ((void)loc, n) |
47 | | |
48 | | /** |
49 | | * CCAN_LIST_HEAD_INIT - initializer for an empty ccan_list_head |
50 | | * @name: the name of the list. |
51 | | * |
52 | | * Explicit initializer for an empty list. |
53 | | * |
54 | | * See also: |
55 | | * CCAN_LIST_HEAD, ccan_list_head_init() |
56 | | * |
57 | | * Example: |
58 | | * static struct ccan_list_head my_list = CCAN_LIST_HEAD_INIT(my_list); |
59 | | */ |
60 | | #define CCAN_LIST_HEAD_INIT(name) { { &(name).n, &(name).n } } |
61 | | |
62 | | /** |
63 | | * CCAN_LIST_HEAD - define and initialize an empty ccan_list_head |
64 | | * @name: the name of the list. |
65 | | * |
66 | | * The CCAN_LIST_HEAD macro defines a ccan_list_head and initializes it to an empty |
67 | | * list. It can be prepended by "static" to define a static ccan_list_head. |
68 | | * |
69 | | * See also: |
70 | | * CCAN_LIST_HEAD_INIT, ccan_list_head_init() |
71 | | * |
72 | | * Example: |
73 | | * static CCAN_LIST_HEAD(my_global_list); |
74 | | */ |
75 | | #define CCAN_LIST_HEAD(name) \ |
76 | | struct ccan_list_head name = CCAN_LIST_HEAD_INIT(name) |
77 | | |
78 | | /** |
79 | | * ccan_list_head_init - initialize a ccan_list_head |
80 | | * @h: the ccan_list_head to set to the empty list |
81 | | * |
82 | | * Example: |
83 | | * ... |
84 | | * struct parent *parent = malloc(sizeof(*parent)); |
85 | | * |
86 | | * ccan_list_head_init(&parent->children); |
87 | | * parent->num_children = 0; |
88 | | */ |
89 | | static inline void ccan_list_head_init(struct ccan_list_head *h) |
90 | 234 | { |
91 | 234 | h->n.next = h->n.prev = &h->n; |
92 | 234 | } Unexecuted instantiation: array.c:ccan_list_head_init Unexecuted instantiation: bignum.c:ccan_list_head_init Unexecuted instantiation: class.c:ccan_list_head_init Unexecuted instantiation: complex.c:ccan_list_head_init Unexecuted instantiation: enumerator.c:ccan_list_head_init Unexecuted instantiation: error.c:ccan_list_head_init Unexecuted instantiation: eval.c:ccan_list_head_init Unexecuted instantiation: file.c:ccan_list_head_init Line | Count | Source | 90 | 45 | { | 91 | 45 | h->n.next = h->n.prev = &h->n; | 92 | 45 | } |
Unexecuted instantiation: hash.c:ccan_list_head_init Unexecuted instantiation: imemo.c:ccan_list_head_init Line | Count | Source | 90 | 54 | { | 91 | 54 | h->n.next = h->n.prev = &h->n; | 92 | 54 | } |
Unexecuted instantiation: io_buffer.c:ccan_list_head_init Unexecuted instantiation: iseq.c:ccan_list_head_init Unexecuted instantiation: load.c:ccan_list_head_init Unexecuted instantiation: marshal.c:ccan_list_head_init Unexecuted instantiation: memory_view.c:ccan_list_head_init Unexecuted instantiation: node.c:ccan_list_head_init Unexecuted instantiation: node_dump.c:ccan_list_head_init Unexecuted instantiation: numeric.c:ccan_list_head_init Unexecuted instantiation: object.c:ccan_list_head_init Unexecuted instantiation: pack.c:ccan_list_head_init Unexecuted instantiation: proc.c:ccan_list_head_init Unexecuted instantiation: process.c:ccan_list_head_init ractor.c:ccan_list_head_init Line | Count | Source | 90 | 45 | { | 91 | 45 | h->n.next = h->n.prev = &h->n; | 92 | 45 | } |
Unexecuted instantiation: random.c:ccan_list_head_init Unexecuted instantiation: rational.c:ccan_list_head_init Unexecuted instantiation: re.c:ccan_list_head_init Unexecuted instantiation: ruby.c:ccan_list_head_init Unexecuted instantiation: scheduler.c:ccan_list_head_init Unexecuted instantiation: set.c:ccan_list_head_init Unexecuted instantiation: shape.c:ccan_list_head_init Unexecuted instantiation: signal.c:ccan_list_head_init Unexecuted instantiation: st.c:ccan_list_head_init Unexecuted instantiation: string.c:ccan_list_head_init Unexecuted instantiation: struct.c:ccan_list_head_init Unexecuted instantiation: symbol.c:ccan_list_head_init thread.c:ccan_list_head_init Line | Count | Source | 90 | 54 | { | 91 | 54 | h->n.next = h->n.prev = &h->n; | 92 | 54 | } |
Unexecuted instantiation: time.c:ccan_list_head_init Unexecuted instantiation: transcode.c:ccan_list_head_init Unexecuted instantiation: variable.c:ccan_list_head_init Unexecuted instantiation: version.c:ccan_list_head_init Line | Count | Source | 90 | 36 | { | 91 | 36 | h->n.next = h->n.prev = &h->n; | 92 | 36 | } |
Unexecuted instantiation: vm_backtrace.c:ccan_list_head_init Unexecuted instantiation: vm_dump.c:ccan_list_head_init Unexecuted instantiation: vm_sync.c:ccan_list_head_init Unexecuted instantiation: vm_trace.c:ccan_list_head_init Unexecuted instantiation: weakmap.c:ccan_list_head_init Unexecuted instantiation: builtin.c:ccan_list_head_init Unexecuted instantiation: ast.c:ccan_list_head_init Unexecuted instantiation: box.c:ccan_list_head_init Unexecuted instantiation: compile.c:ccan_list_head_init Unexecuted instantiation: concurrent_set.c:ccan_list_head_init Unexecuted instantiation: cont.c:ccan_list_head_init Unexecuted instantiation: debug.c:ccan_list_head_init Unexecuted instantiation: dir.c:ccan_list_head_init Unexecuted instantiation: parse.c:ccan_list_head_init |
93 | | |
94 | | /** |
95 | | * ccan_list_node_init - initialize a ccan_list_node |
96 | | * @n: the ccan_list_node to link to itself. |
97 | | * |
98 | | * You don't need to use this normally! But it lets you ccan_list_del(@n) |
99 | | * safely. |
100 | | */ |
101 | | static inline void ccan_list_node_init(struct ccan_list_node *n) |
102 | 44 | { |
103 | 44 | n->next = n->prev = n; |
104 | 44 | } Unexecuted instantiation: array.c:ccan_list_node_init Unexecuted instantiation: bignum.c:ccan_list_node_init Unexecuted instantiation: class.c:ccan_list_node_init Unexecuted instantiation: complex.c:ccan_list_node_init Unexecuted instantiation: enumerator.c:ccan_list_node_init Unexecuted instantiation: error.c:ccan_list_node_init Unexecuted instantiation: eval.c:ccan_list_node_init Unexecuted instantiation: file.c:ccan_list_node_init Unexecuted instantiation: gc.c:ccan_list_node_init Unexecuted instantiation: hash.c:ccan_list_node_init Unexecuted instantiation: imemo.c:ccan_list_node_init Unexecuted instantiation: io.c:ccan_list_node_init Unexecuted instantiation: io_buffer.c:ccan_list_node_init Unexecuted instantiation: iseq.c:ccan_list_node_init Unexecuted instantiation: load.c:ccan_list_node_init Unexecuted instantiation: marshal.c:ccan_list_node_init Unexecuted instantiation: memory_view.c:ccan_list_node_init Unexecuted instantiation: node.c:ccan_list_node_init Unexecuted instantiation: node_dump.c:ccan_list_node_init Unexecuted instantiation: numeric.c:ccan_list_node_init Unexecuted instantiation: object.c:ccan_list_node_init Unexecuted instantiation: pack.c:ccan_list_node_init Unexecuted instantiation: proc.c:ccan_list_node_init Unexecuted instantiation: process.c:ccan_list_node_init Unexecuted instantiation: ractor.c:ccan_list_node_init Unexecuted instantiation: random.c:ccan_list_node_init Unexecuted instantiation: rational.c:ccan_list_node_init Unexecuted instantiation: re.c:ccan_list_node_init Unexecuted instantiation: ruby.c:ccan_list_node_init Unexecuted instantiation: scheduler.c:ccan_list_node_init Unexecuted instantiation: set.c:ccan_list_node_init Unexecuted instantiation: shape.c:ccan_list_node_init Unexecuted instantiation: signal.c:ccan_list_node_init Unexecuted instantiation: st.c:ccan_list_node_init Unexecuted instantiation: string.c:ccan_list_node_init Unexecuted instantiation: struct.c:ccan_list_node_init Unexecuted instantiation: symbol.c:ccan_list_node_init thread.c:ccan_list_node_init Line | Count | Source | 102 | 44 | { | 103 | 44 | n->next = n->prev = n; | 104 | 44 | } |
Unexecuted instantiation: time.c:ccan_list_node_init Unexecuted instantiation: transcode.c:ccan_list_node_init Unexecuted instantiation: variable.c:ccan_list_node_init Unexecuted instantiation: version.c:ccan_list_node_init Unexecuted instantiation: vm.c:ccan_list_node_init Unexecuted instantiation: vm_backtrace.c:ccan_list_node_init Unexecuted instantiation: vm_dump.c:ccan_list_node_init Unexecuted instantiation: vm_sync.c:ccan_list_node_init Unexecuted instantiation: vm_trace.c:ccan_list_node_init Unexecuted instantiation: weakmap.c:ccan_list_node_init Unexecuted instantiation: builtin.c:ccan_list_node_init Unexecuted instantiation: ast.c:ccan_list_node_init Unexecuted instantiation: box.c:ccan_list_node_init Unexecuted instantiation: compile.c:ccan_list_node_init Unexecuted instantiation: concurrent_set.c:ccan_list_node_init Unexecuted instantiation: cont.c:ccan_list_node_init Unexecuted instantiation: debug.c:ccan_list_node_init Unexecuted instantiation: dir.c:ccan_list_node_init Unexecuted instantiation: parse.c:ccan_list_node_init |
105 | | |
106 | | /** |
107 | | * ccan_list_add_after - add an entry after an existing node in a linked list |
108 | | * @h: the ccan_list_head to add the node to (for debugging) |
109 | | * @p: the existing ccan_list_node to add the node after |
110 | | * @n: the new ccan_list_node to add to the list. |
111 | | * |
112 | | * The existing ccan_list_node must already be a member of the list. |
113 | | * The new ccan_list_node does not need to be initialized; it will be overwritten. |
114 | | * |
115 | | * Example: |
116 | | * struct child c1, c2, c3; |
117 | | * CCAN_LIST_HEAD(h); |
118 | | * |
119 | | * ccan_list_add_tail(&h, &c1.list); |
120 | | * ccan_list_add_tail(&h, &c3.list); |
121 | | * ccan_list_add_after(&h, &c1.list, &c2.list); |
122 | | */ |
123 | 0 | #define ccan_list_add_after(h, p, n) ccan_list_add_after_(h, p, n, CCAN_LIST_LOC) |
124 | | static inline void ccan_list_add_after_(struct ccan_list_head *h, |
125 | | struct ccan_list_node *p, |
126 | | struct ccan_list_node *n, |
127 | | const char *abortstr) |
128 | 44 | { |
129 | 44 | n->next = p->next; |
130 | 44 | n->prev = p; |
131 | 44 | p->next->prev = n; |
132 | 44 | p->next = n; |
133 | 44 | (void)ccan_list_debug(h, abortstr); |
134 | 44 | } Unexecuted instantiation: array.c:ccan_list_add_after_ Unexecuted instantiation: bignum.c:ccan_list_add_after_ Unexecuted instantiation: class.c:ccan_list_add_after_ Unexecuted instantiation: complex.c:ccan_list_add_after_ Unexecuted instantiation: enumerator.c:ccan_list_add_after_ Unexecuted instantiation: error.c:ccan_list_add_after_ Unexecuted instantiation: eval.c:ccan_list_add_after_ Unexecuted instantiation: file.c:ccan_list_add_after_ Unexecuted instantiation: gc.c:ccan_list_add_after_ Unexecuted instantiation: hash.c:ccan_list_add_after_ Unexecuted instantiation: imemo.c:ccan_list_add_after_ Unexecuted instantiation: io.c:ccan_list_add_after_ Unexecuted instantiation: io_buffer.c:ccan_list_add_after_ Unexecuted instantiation: iseq.c:ccan_list_add_after_ Unexecuted instantiation: load.c:ccan_list_add_after_ Unexecuted instantiation: marshal.c:ccan_list_add_after_ Unexecuted instantiation: memory_view.c:ccan_list_add_after_ Unexecuted instantiation: node.c:ccan_list_add_after_ Unexecuted instantiation: node_dump.c:ccan_list_add_after_ Unexecuted instantiation: numeric.c:ccan_list_add_after_ Unexecuted instantiation: object.c:ccan_list_add_after_ Unexecuted instantiation: pack.c:ccan_list_add_after_ Unexecuted instantiation: proc.c:ccan_list_add_after_ Unexecuted instantiation: process.c:ccan_list_add_after_ Unexecuted instantiation: ractor.c:ccan_list_add_after_ Unexecuted instantiation: random.c:ccan_list_add_after_ Unexecuted instantiation: rational.c:ccan_list_add_after_ Unexecuted instantiation: re.c:ccan_list_add_after_ Unexecuted instantiation: ruby.c:ccan_list_add_after_ Unexecuted instantiation: scheduler.c:ccan_list_add_after_ Unexecuted instantiation: set.c:ccan_list_add_after_ Unexecuted instantiation: shape.c:ccan_list_add_after_ Unexecuted instantiation: signal.c:ccan_list_add_after_ Unexecuted instantiation: st.c:ccan_list_add_after_ Unexecuted instantiation: string.c:ccan_list_add_after_ Unexecuted instantiation: struct.c:ccan_list_add_after_ Unexecuted instantiation: symbol.c:ccan_list_add_after_ thread.c:ccan_list_add_after_ Line | Count | Source | 128 | 44 | { | 129 | 44 | n->next = p->next; | 130 | 44 | n->prev = p; | 131 | 44 | p->next->prev = n; | 132 | 44 | p->next = n; | 133 | 44 | (void)ccan_list_debug(h, abortstr); | 134 | 44 | } |
Unexecuted instantiation: time.c:ccan_list_add_after_ Unexecuted instantiation: transcode.c:ccan_list_add_after_ Unexecuted instantiation: variable.c:ccan_list_add_after_ Unexecuted instantiation: version.c:ccan_list_add_after_ Unexecuted instantiation: vm.c:ccan_list_add_after_ Unexecuted instantiation: vm_backtrace.c:ccan_list_add_after_ Unexecuted instantiation: vm_dump.c:ccan_list_add_after_ Unexecuted instantiation: vm_sync.c:ccan_list_add_after_ Unexecuted instantiation: vm_trace.c:ccan_list_add_after_ Unexecuted instantiation: weakmap.c:ccan_list_add_after_ Unexecuted instantiation: builtin.c:ccan_list_add_after_ Unexecuted instantiation: ast.c:ccan_list_add_after_ Unexecuted instantiation: box.c:ccan_list_add_after_ Unexecuted instantiation: compile.c:ccan_list_add_after_ Unexecuted instantiation: concurrent_set.c:ccan_list_add_after_ Unexecuted instantiation: cont.c:ccan_list_add_after_ Unexecuted instantiation: debug.c:ccan_list_add_after_ Unexecuted instantiation: dir.c:ccan_list_add_after_ Unexecuted instantiation: parse.c:ccan_list_add_after_ |
135 | | |
136 | | /** |
137 | | * ccan_list_add - add an entry at the start of a linked list. |
138 | | * @h: the ccan_list_head to add the node to |
139 | | * @n: the ccan_list_node to add to the list. |
140 | | * |
141 | | * The ccan_list_node does not need to be initialized; it will be overwritten. |
142 | | * Example: |
143 | | * struct child *child = malloc(sizeof(*child)); |
144 | | * |
145 | | * child->name = "marvin"; |
146 | | * ccan_list_add(&parent->children, &child->list); |
147 | | * parent->num_children++; |
148 | | */ |
149 | 44 | #define ccan_list_add(h, n) ccan_list_add_(h, n, CCAN_LIST_LOC) |
150 | | static inline void ccan_list_add_(struct ccan_list_head *h, |
151 | | struct ccan_list_node *n, |
152 | | const char *abortstr) |
153 | 44 | { |
154 | 44 | ccan_list_add_after_(h, &h->n, n, abortstr); |
155 | 44 | } Unexecuted instantiation: array.c:ccan_list_add_ Unexecuted instantiation: bignum.c:ccan_list_add_ Unexecuted instantiation: class.c:ccan_list_add_ Unexecuted instantiation: complex.c:ccan_list_add_ Unexecuted instantiation: enumerator.c:ccan_list_add_ Unexecuted instantiation: error.c:ccan_list_add_ Unexecuted instantiation: eval.c:ccan_list_add_ Unexecuted instantiation: file.c:ccan_list_add_ Unexecuted instantiation: gc.c:ccan_list_add_ Unexecuted instantiation: hash.c:ccan_list_add_ Unexecuted instantiation: imemo.c:ccan_list_add_ Unexecuted instantiation: io.c:ccan_list_add_ Unexecuted instantiation: io_buffer.c:ccan_list_add_ Unexecuted instantiation: iseq.c:ccan_list_add_ Unexecuted instantiation: load.c:ccan_list_add_ Unexecuted instantiation: marshal.c:ccan_list_add_ Unexecuted instantiation: memory_view.c:ccan_list_add_ Unexecuted instantiation: node.c:ccan_list_add_ Unexecuted instantiation: node_dump.c:ccan_list_add_ Unexecuted instantiation: numeric.c:ccan_list_add_ Unexecuted instantiation: object.c:ccan_list_add_ Unexecuted instantiation: pack.c:ccan_list_add_ Unexecuted instantiation: proc.c:ccan_list_add_ Unexecuted instantiation: process.c:ccan_list_add_ Unexecuted instantiation: ractor.c:ccan_list_add_ Unexecuted instantiation: random.c:ccan_list_add_ Unexecuted instantiation: rational.c:ccan_list_add_ Unexecuted instantiation: re.c:ccan_list_add_ Unexecuted instantiation: ruby.c:ccan_list_add_ Unexecuted instantiation: scheduler.c:ccan_list_add_ Unexecuted instantiation: set.c:ccan_list_add_ Unexecuted instantiation: shape.c:ccan_list_add_ Unexecuted instantiation: signal.c:ccan_list_add_ Unexecuted instantiation: st.c:ccan_list_add_ Unexecuted instantiation: string.c:ccan_list_add_ Unexecuted instantiation: struct.c:ccan_list_add_ Unexecuted instantiation: symbol.c:ccan_list_add_ Line | Count | Source | 153 | 44 | { | 154 | 44 | ccan_list_add_after_(h, &h->n, n, abortstr); | 155 | 44 | } |
Unexecuted instantiation: time.c:ccan_list_add_ Unexecuted instantiation: transcode.c:ccan_list_add_ Unexecuted instantiation: variable.c:ccan_list_add_ Unexecuted instantiation: version.c:ccan_list_add_ Unexecuted instantiation: vm.c:ccan_list_add_ Unexecuted instantiation: vm_backtrace.c:ccan_list_add_ Unexecuted instantiation: vm_dump.c:ccan_list_add_ Unexecuted instantiation: vm_sync.c:ccan_list_add_ Unexecuted instantiation: vm_trace.c:ccan_list_add_ Unexecuted instantiation: weakmap.c:ccan_list_add_ Unexecuted instantiation: builtin.c:ccan_list_add_ Unexecuted instantiation: ast.c:ccan_list_add_ Unexecuted instantiation: box.c:ccan_list_add_ Unexecuted instantiation: compile.c:ccan_list_add_ Unexecuted instantiation: concurrent_set.c:ccan_list_add_ Unexecuted instantiation: cont.c:ccan_list_add_ Unexecuted instantiation: debug.c:ccan_list_add_ Unexecuted instantiation: dir.c:ccan_list_add_ Unexecuted instantiation: parse.c:ccan_list_add_ |
156 | | |
157 | | /** |
158 | | * ccan_list_add_before - add an entry before an existing node in a linked list |
159 | | * @h: the ccan_list_head to add the node to (for debugging) |
160 | | * @p: the existing ccan_list_node to add the node before |
161 | | * @n: the new ccan_list_node to add to the list. |
162 | | * |
163 | | * The existing ccan_list_node must already be a member of the list. |
164 | | * The new ccan_list_node does not need to be initialized; it will be overwritten. |
165 | | * |
166 | | * Example: |
167 | | * ccan_list_head_init(&h); |
168 | | * ccan_list_add_tail(&h, &c1.list); |
169 | | * ccan_list_add_tail(&h, &c3.list); |
170 | | * ccan_list_add_before(&h, &c3.list, &c2.list); |
171 | | */ |
172 | | #define ccan_list_add_before(h, p, n) ccan_list_add_before_(h, p, n, CCAN_LIST_LOC) |
173 | | static inline void ccan_list_add_before_(struct ccan_list_head *h, |
174 | | struct ccan_list_node *p, |
175 | | struct ccan_list_node *n, |
176 | | const char *abortstr) |
177 | 10.8k | { |
178 | 10.8k | n->next = p; |
179 | 10.8k | n->prev = p->prev; |
180 | 10.8k | p->prev->next = n; |
181 | 10.8k | p->prev = n; |
182 | 10.8k | (void)ccan_list_debug(h, abortstr); |
183 | 10.8k | } Unexecuted instantiation: array.c:ccan_list_add_before_ Unexecuted instantiation: bignum.c:ccan_list_add_before_ Unexecuted instantiation: class.c:ccan_list_add_before_ Unexecuted instantiation: complex.c:ccan_list_add_before_ Unexecuted instantiation: enumerator.c:ccan_list_add_before_ Unexecuted instantiation: error.c:ccan_list_add_before_ Unexecuted instantiation: eval.c:ccan_list_add_before_ Unexecuted instantiation: file.c:ccan_list_add_before_ gc.c:ccan_list_add_before_ Line | Count | Source | 177 | 10.7k | { | 178 | 10.7k | n->next = p; | 179 | 10.7k | n->prev = p->prev; | 180 | 10.7k | p->prev->next = n; | 181 | 10.7k | p->prev = n; | 182 | 10.7k | (void)ccan_list_debug(h, abortstr); | 183 | 10.7k | } |
Unexecuted instantiation: hash.c:ccan_list_add_before_ Unexecuted instantiation: imemo.c:ccan_list_add_before_ Unexecuted instantiation: io.c:ccan_list_add_before_ Unexecuted instantiation: io_buffer.c:ccan_list_add_before_ Unexecuted instantiation: iseq.c:ccan_list_add_before_ Unexecuted instantiation: load.c:ccan_list_add_before_ Unexecuted instantiation: marshal.c:ccan_list_add_before_ Unexecuted instantiation: memory_view.c:ccan_list_add_before_ Unexecuted instantiation: node.c:ccan_list_add_before_ Unexecuted instantiation: node_dump.c:ccan_list_add_before_ Unexecuted instantiation: numeric.c:ccan_list_add_before_ Unexecuted instantiation: object.c:ccan_list_add_before_ Unexecuted instantiation: pack.c:ccan_list_add_before_ Unexecuted instantiation: proc.c:ccan_list_add_before_ Unexecuted instantiation: process.c:ccan_list_add_before_ ractor.c:ccan_list_add_before_ Line | Count | Source | 177 | 18 | { | 178 | 18 | n->next = p; | 179 | 18 | n->prev = p->prev; | 180 | 18 | p->prev->next = n; | 181 | 18 | p->prev = n; | 182 | 18 | (void)ccan_list_debug(h, abortstr); | 183 | 18 | } |
Unexecuted instantiation: random.c:ccan_list_add_before_ Unexecuted instantiation: rational.c:ccan_list_add_before_ Unexecuted instantiation: re.c:ccan_list_add_before_ Unexecuted instantiation: ruby.c:ccan_list_add_before_ Unexecuted instantiation: scheduler.c:ccan_list_add_before_ Unexecuted instantiation: set.c:ccan_list_add_before_ Unexecuted instantiation: shape.c:ccan_list_add_before_ Unexecuted instantiation: signal.c:ccan_list_add_before_ Unexecuted instantiation: st.c:ccan_list_add_before_ Unexecuted instantiation: string.c:ccan_list_add_before_ Unexecuted instantiation: struct.c:ccan_list_add_before_ Unexecuted instantiation: symbol.c:ccan_list_add_before_ Unexecuted instantiation: thread.c:ccan_list_add_before_ Unexecuted instantiation: time.c:ccan_list_add_before_ Unexecuted instantiation: transcode.c:ccan_list_add_before_ Unexecuted instantiation: variable.c:ccan_list_add_before_ Unexecuted instantiation: version.c:ccan_list_add_before_ Unexecuted instantiation: vm.c:ccan_list_add_before_ Unexecuted instantiation: vm_backtrace.c:ccan_list_add_before_ Unexecuted instantiation: vm_dump.c:ccan_list_add_before_ Unexecuted instantiation: vm_sync.c:ccan_list_add_before_ Unexecuted instantiation: vm_trace.c:ccan_list_add_before_ Unexecuted instantiation: weakmap.c:ccan_list_add_before_ Unexecuted instantiation: builtin.c:ccan_list_add_before_ Unexecuted instantiation: ast.c:ccan_list_add_before_ Unexecuted instantiation: box.c:ccan_list_add_before_ Unexecuted instantiation: compile.c:ccan_list_add_before_ Unexecuted instantiation: concurrent_set.c:ccan_list_add_before_ Unexecuted instantiation: cont.c:ccan_list_add_before_ Unexecuted instantiation: debug.c:ccan_list_add_before_ Unexecuted instantiation: dir.c:ccan_list_add_before_ Unexecuted instantiation: parse.c:ccan_list_add_before_ |
184 | | |
185 | | /** |
186 | | * ccan_list_add_tail - add an entry at the end of a linked list. |
187 | | * @h: the ccan_list_head to add the node to |
188 | | * @n: the ccan_list_node to add to the list. |
189 | | * |
190 | | * The ccan_list_node does not need to be initialized; it will be overwritten. |
191 | | * Example: |
192 | | * ccan_list_add_tail(&parent->children, &child->list); |
193 | | * parent->num_children++; |
194 | | */ |
195 | 10.8k | #define ccan_list_add_tail(h, n) ccan_list_add_tail_(h, n, CCAN_LIST_LOC) |
196 | | static inline void ccan_list_add_tail_(struct ccan_list_head *h, |
197 | | struct ccan_list_node *n, |
198 | | const char *abortstr) |
199 | 10.8k | { |
200 | 10.8k | ccan_list_add_before_(h, &h->n, n, abortstr); |
201 | 10.8k | } Unexecuted instantiation: array.c:ccan_list_add_tail_ Unexecuted instantiation: bignum.c:ccan_list_add_tail_ Unexecuted instantiation: class.c:ccan_list_add_tail_ Unexecuted instantiation: complex.c:ccan_list_add_tail_ Unexecuted instantiation: enumerator.c:ccan_list_add_tail_ Unexecuted instantiation: error.c:ccan_list_add_tail_ Unexecuted instantiation: eval.c:ccan_list_add_tail_ Unexecuted instantiation: file.c:ccan_list_add_tail_ Line | Count | Source | 199 | 10.7k | { | 200 | 10.7k | ccan_list_add_before_(h, &h->n, n, abortstr); | 201 | 10.7k | } |
Unexecuted instantiation: hash.c:ccan_list_add_tail_ Unexecuted instantiation: imemo.c:ccan_list_add_tail_ Unexecuted instantiation: io.c:ccan_list_add_tail_ Unexecuted instantiation: io_buffer.c:ccan_list_add_tail_ Unexecuted instantiation: iseq.c:ccan_list_add_tail_ Unexecuted instantiation: load.c:ccan_list_add_tail_ Unexecuted instantiation: marshal.c:ccan_list_add_tail_ Unexecuted instantiation: memory_view.c:ccan_list_add_tail_ Unexecuted instantiation: node.c:ccan_list_add_tail_ Unexecuted instantiation: node_dump.c:ccan_list_add_tail_ Unexecuted instantiation: numeric.c:ccan_list_add_tail_ Unexecuted instantiation: object.c:ccan_list_add_tail_ Unexecuted instantiation: pack.c:ccan_list_add_tail_ Unexecuted instantiation: proc.c:ccan_list_add_tail_ Unexecuted instantiation: process.c:ccan_list_add_tail_ ractor.c:ccan_list_add_tail_ Line | Count | Source | 199 | 18 | { | 200 | 18 | ccan_list_add_before_(h, &h->n, n, abortstr); | 201 | 18 | } |
Unexecuted instantiation: random.c:ccan_list_add_tail_ Unexecuted instantiation: rational.c:ccan_list_add_tail_ Unexecuted instantiation: re.c:ccan_list_add_tail_ Unexecuted instantiation: ruby.c:ccan_list_add_tail_ Unexecuted instantiation: scheduler.c:ccan_list_add_tail_ Unexecuted instantiation: set.c:ccan_list_add_tail_ Unexecuted instantiation: shape.c:ccan_list_add_tail_ Unexecuted instantiation: signal.c:ccan_list_add_tail_ Unexecuted instantiation: st.c:ccan_list_add_tail_ Unexecuted instantiation: string.c:ccan_list_add_tail_ Unexecuted instantiation: struct.c:ccan_list_add_tail_ Unexecuted instantiation: symbol.c:ccan_list_add_tail_ Unexecuted instantiation: thread.c:ccan_list_add_tail_ Unexecuted instantiation: time.c:ccan_list_add_tail_ Unexecuted instantiation: transcode.c:ccan_list_add_tail_ Unexecuted instantiation: variable.c:ccan_list_add_tail_ Unexecuted instantiation: version.c:ccan_list_add_tail_ Unexecuted instantiation: vm.c:ccan_list_add_tail_ Unexecuted instantiation: vm_backtrace.c:ccan_list_add_tail_ Unexecuted instantiation: vm_dump.c:ccan_list_add_tail_ Unexecuted instantiation: vm_sync.c:ccan_list_add_tail_ Unexecuted instantiation: vm_trace.c:ccan_list_add_tail_ Unexecuted instantiation: weakmap.c:ccan_list_add_tail_ Unexecuted instantiation: builtin.c:ccan_list_add_tail_ Unexecuted instantiation: ast.c:ccan_list_add_tail_ Unexecuted instantiation: box.c:ccan_list_add_tail_ Unexecuted instantiation: compile.c:ccan_list_add_tail_ Unexecuted instantiation: concurrent_set.c:ccan_list_add_tail_ Unexecuted instantiation: cont.c:ccan_list_add_tail_ Unexecuted instantiation: debug.c:ccan_list_add_tail_ Unexecuted instantiation: dir.c:ccan_list_add_tail_ Unexecuted instantiation: parse.c:ccan_list_add_tail_ |
202 | | |
203 | | /** |
204 | | * ccan_list_empty - is a list empty? |
205 | | * @h: the ccan_list_head |
206 | | * |
207 | | * If the list is empty, returns true. |
208 | | * |
209 | | * Example: |
210 | | * assert(ccan_list_empty(&parent->children) == (parent->num_children == 0)); |
211 | | */ |
212 | 273k | #define ccan_list_empty(h) ccan_list_empty_(h, CCAN_LIST_LOC) |
213 | | static inline int ccan_list_empty_(const struct ccan_list_head *h, const char* abortstr) |
214 | 273k | { |
215 | 273k | (void)ccan_list_debug(h, abortstr); |
216 | 273k | return h->n.next == &h->n; |
217 | 273k | } Unexecuted instantiation: array.c:ccan_list_empty_ Unexecuted instantiation: bignum.c:ccan_list_empty_ Unexecuted instantiation: class.c:ccan_list_empty_ Unexecuted instantiation: complex.c:ccan_list_empty_ Unexecuted instantiation: enumerator.c:ccan_list_empty_ Unexecuted instantiation: error.c:ccan_list_empty_ Unexecuted instantiation: eval.c:ccan_list_empty_ Unexecuted instantiation: file.c:ccan_list_empty_ Line | Count | Source | 214 | 227k | { | 215 | 227k | (void)ccan_list_debug(h, abortstr); | 216 | 227k | return h->n.next == &h->n; | 217 | 227k | } |
Unexecuted instantiation: hash.c:ccan_list_empty_ Unexecuted instantiation: imemo.c:ccan_list_empty_ Unexecuted instantiation: io.c:ccan_list_empty_ Unexecuted instantiation: io_buffer.c:ccan_list_empty_ Unexecuted instantiation: iseq.c:ccan_list_empty_ Unexecuted instantiation: load.c:ccan_list_empty_ Unexecuted instantiation: marshal.c:ccan_list_empty_ Unexecuted instantiation: memory_view.c:ccan_list_empty_ Unexecuted instantiation: node.c:ccan_list_empty_ Unexecuted instantiation: node_dump.c:ccan_list_empty_ Unexecuted instantiation: numeric.c:ccan_list_empty_ Unexecuted instantiation: object.c:ccan_list_empty_ Unexecuted instantiation: pack.c:ccan_list_empty_ Unexecuted instantiation: proc.c:ccan_list_empty_ Unexecuted instantiation: process.c:ccan_list_empty_ Unexecuted instantiation: ractor.c:ccan_list_empty_ Unexecuted instantiation: random.c:ccan_list_empty_ Unexecuted instantiation: rational.c:ccan_list_empty_ Unexecuted instantiation: re.c:ccan_list_empty_ Unexecuted instantiation: ruby.c:ccan_list_empty_ Unexecuted instantiation: scheduler.c:ccan_list_empty_ Unexecuted instantiation: set.c:ccan_list_empty_ Unexecuted instantiation: shape.c:ccan_list_empty_ Unexecuted instantiation: signal.c:ccan_list_empty_ Unexecuted instantiation: st.c:ccan_list_empty_ Unexecuted instantiation: string.c:ccan_list_empty_ Unexecuted instantiation: struct.c:ccan_list_empty_ Unexecuted instantiation: symbol.c:ccan_list_empty_ thread.c:ccan_list_empty_ Line | Count | Source | 214 | 45.6k | { | 215 | 45.6k | (void)ccan_list_debug(h, abortstr); | 216 | 45.6k | return h->n.next == &h->n; | 217 | 45.6k | } |
Unexecuted instantiation: time.c:ccan_list_empty_ Unexecuted instantiation: transcode.c:ccan_list_empty_ Unexecuted instantiation: variable.c:ccan_list_empty_ Unexecuted instantiation: version.c:ccan_list_empty_ Unexecuted instantiation: vm.c:ccan_list_empty_ Unexecuted instantiation: vm_backtrace.c:ccan_list_empty_ Unexecuted instantiation: vm_dump.c:ccan_list_empty_ Unexecuted instantiation: vm_sync.c:ccan_list_empty_ Unexecuted instantiation: vm_trace.c:ccan_list_empty_ Unexecuted instantiation: weakmap.c:ccan_list_empty_ Unexecuted instantiation: builtin.c:ccan_list_empty_ Unexecuted instantiation: ast.c:ccan_list_empty_ Unexecuted instantiation: box.c:ccan_list_empty_ Unexecuted instantiation: compile.c:ccan_list_empty_ Unexecuted instantiation: concurrent_set.c:ccan_list_empty_ Unexecuted instantiation: cont.c:ccan_list_empty_ Unexecuted instantiation: debug.c:ccan_list_empty_ Unexecuted instantiation: dir.c:ccan_list_empty_ Unexecuted instantiation: parse.c:ccan_list_empty_ |
218 | | |
219 | | /** |
220 | | * ccan_list_empty_nodebug - is a list empty (and don't perform debug checks)? |
221 | | * @h: the ccan_list_head |
222 | | * |
223 | | * If the list is empty, returns true. |
224 | | * This differs from list_empty() in that if CCAN_LIST_DEBUG is set it |
225 | | * will NOT perform debug checks. Only use this function if you REALLY |
226 | | * know what you're doing. |
227 | | * |
228 | | * Example: |
229 | | * assert(ccan_list_empty_nodebug(&parent->children) == (parent->num_children == 0)); |
230 | | */ |
231 | | #ifndef CCAN_LIST_DEBUG |
232 | | #define ccan_list_empty_nodebug(h) ccan_list_empty(h) |
233 | | #else |
234 | | static inline int ccan_list_empty_nodebug(const struct ccan_list_head *h) |
235 | | { |
236 | | return h->n.next == &h->n; |
237 | | } |
238 | | #endif |
239 | | |
240 | | /** |
241 | | * ccan_list_empty_nocheck - is a list empty? |
242 | | * @h: the ccan_list_head |
243 | | * |
244 | | * If the list is empty, returns true. This doesn't perform any |
245 | | * debug check for list consistency, so it can be called without |
246 | | * locks, racing with the list being modified. This is ok for |
247 | | * checks where an incorrect result is not an issue (optimized |
248 | | * bail out path for example). |
249 | | */ |
250 | | static inline bool ccan_list_empty_nocheck(const struct ccan_list_head *h) |
251 | 0 | { |
252 | 0 | return h->n.next == &h->n; |
253 | 0 | } Unexecuted instantiation: array.c:ccan_list_empty_nocheck Unexecuted instantiation: bignum.c:ccan_list_empty_nocheck Unexecuted instantiation: class.c:ccan_list_empty_nocheck Unexecuted instantiation: complex.c:ccan_list_empty_nocheck Unexecuted instantiation: enumerator.c:ccan_list_empty_nocheck Unexecuted instantiation: error.c:ccan_list_empty_nocheck Unexecuted instantiation: eval.c:ccan_list_empty_nocheck Unexecuted instantiation: file.c:ccan_list_empty_nocheck Unexecuted instantiation: gc.c:ccan_list_empty_nocheck Unexecuted instantiation: hash.c:ccan_list_empty_nocheck Unexecuted instantiation: imemo.c:ccan_list_empty_nocheck Unexecuted instantiation: io.c:ccan_list_empty_nocheck Unexecuted instantiation: io_buffer.c:ccan_list_empty_nocheck Unexecuted instantiation: iseq.c:ccan_list_empty_nocheck Unexecuted instantiation: load.c:ccan_list_empty_nocheck Unexecuted instantiation: marshal.c:ccan_list_empty_nocheck Unexecuted instantiation: memory_view.c:ccan_list_empty_nocheck Unexecuted instantiation: node.c:ccan_list_empty_nocheck Unexecuted instantiation: node_dump.c:ccan_list_empty_nocheck Unexecuted instantiation: numeric.c:ccan_list_empty_nocheck Unexecuted instantiation: object.c:ccan_list_empty_nocheck Unexecuted instantiation: pack.c:ccan_list_empty_nocheck Unexecuted instantiation: proc.c:ccan_list_empty_nocheck Unexecuted instantiation: process.c:ccan_list_empty_nocheck Unexecuted instantiation: ractor.c:ccan_list_empty_nocheck Unexecuted instantiation: random.c:ccan_list_empty_nocheck Unexecuted instantiation: rational.c:ccan_list_empty_nocheck Unexecuted instantiation: re.c:ccan_list_empty_nocheck Unexecuted instantiation: ruby.c:ccan_list_empty_nocheck Unexecuted instantiation: scheduler.c:ccan_list_empty_nocheck Unexecuted instantiation: set.c:ccan_list_empty_nocheck Unexecuted instantiation: shape.c:ccan_list_empty_nocheck Unexecuted instantiation: signal.c:ccan_list_empty_nocheck Unexecuted instantiation: st.c:ccan_list_empty_nocheck Unexecuted instantiation: string.c:ccan_list_empty_nocheck Unexecuted instantiation: struct.c:ccan_list_empty_nocheck Unexecuted instantiation: symbol.c:ccan_list_empty_nocheck Unexecuted instantiation: thread.c:ccan_list_empty_nocheck Unexecuted instantiation: time.c:ccan_list_empty_nocheck Unexecuted instantiation: transcode.c:ccan_list_empty_nocheck Unexecuted instantiation: variable.c:ccan_list_empty_nocheck Unexecuted instantiation: version.c:ccan_list_empty_nocheck Unexecuted instantiation: vm.c:ccan_list_empty_nocheck Unexecuted instantiation: vm_backtrace.c:ccan_list_empty_nocheck Unexecuted instantiation: vm_dump.c:ccan_list_empty_nocheck Unexecuted instantiation: vm_sync.c:ccan_list_empty_nocheck Unexecuted instantiation: vm_trace.c:ccan_list_empty_nocheck Unexecuted instantiation: weakmap.c:ccan_list_empty_nocheck Unexecuted instantiation: builtin.c:ccan_list_empty_nocheck Unexecuted instantiation: ast.c:ccan_list_empty_nocheck Unexecuted instantiation: box.c:ccan_list_empty_nocheck Unexecuted instantiation: compile.c:ccan_list_empty_nocheck Unexecuted instantiation: concurrent_set.c:ccan_list_empty_nocheck Unexecuted instantiation: cont.c:ccan_list_empty_nocheck Unexecuted instantiation: debug.c:ccan_list_empty_nocheck Unexecuted instantiation: dir.c:ccan_list_empty_nocheck Unexecuted instantiation: parse.c:ccan_list_empty_nocheck |
254 | | |
255 | | /** |
256 | | * ccan_list_del - delete an entry from an (unknown) linked list. |
257 | | * @n: the ccan_list_node to delete from the list. |
258 | | * |
259 | | * Note that this leaves @n in an undefined state; it can be added to |
260 | | * another list, but not deleted again. |
261 | | * |
262 | | * See also: |
263 | | * ccan_list_del_from(), ccan_list_del_init() |
264 | | * |
265 | | * Example: |
266 | | * ccan_list_del(&child->list); |
267 | | * parent->num_children--; |
268 | | */ |
269 | 10.6k | #define ccan_list_del(n) ccan_list_del_(n, CCAN_LIST_LOC) |
270 | | static inline void ccan_list_del_(struct ccan_list_node *n, const char* abortstr) |
271 | 10.7k | { |
272 | 10.7k | (void)ccan_list_debug_node(n, abortstr); |
273 | 10.7k | n->next->prev = n->prev; |
274 | 10.7k | n->prev->next = n->next; |
275 | | #ifdef CCAN_LIST_DEBUG |
276 | | /* Catch use-after-del. */ |
277 | | n->next = n->prev = NULL; |
278 | | #endif |
279 | 10.7k | } Unexecuted instantiation: array.c:ccan_list_del_ Unexecuted instantiation: bignum.c:ccan_list_del_ Unexecuted instantiation: class.c:ccan_list_del_ Unexecuted instantiation: complex.c:ccan_list_del_ Unexecuted instantiation: enumerator.c:ccan_list_del_ Unexecuted instantiation: error.c:ccan_list_del_ Unexecuted instantiation: eval.c:ccan_list_del_ Unexecuted instantiation: file.c:ccan_list_del_ Line | Count | Source | 271 | 10.6k | { | 272 | 10.6k | (void)ccan_list_debug_node(n, abortstr); | 273 | 10.6k | n->next->prev = n->prev; | 274 | 10.6k | n->prev->next = n->next; | 275 | | #ifdef CCAN_LIST_DEBUG | 276 | | /* Catch use-after-del. */ | 277 | | n->next = n->prev = NULL; | 278 | | #endif | 279 | 10.6k | } |
Unexecuted instantiation: hash.c:ccan_list_del_ Unexecuted instantiation: imemo.c:ccan_list_del_ Unexecuted instantiation: io.c:ccan_list_del_ Unexecuted instantiation: io_buffer.c:ccan_list_del_ Unexecuted instantiation: iseq.c:ccan_list_del_ Unexecuted instantiation: load.c:ccan_list_del_ Unexecuted instantiation: marshal.c:ccan_list_del_ Unexecuted instantiation: memory_view.c:ccan_list_del_ Unexecuted instantiation: node.c:ccan_list_del_ Unexecuted instantiation: node_dump.c:ccan_list_del_ Unexecuted instantiation: numeric.c:ccan_list_del_ Unexecuted instantiation: object.c:ccan_list_del_ Unexecuted instantiation: pack.c:ccan_list_del_ Unexecuted instantiation: proc.c:ccan_list_del_ Unexecuted instantiation: process.c:ccan_list_del_ Unexecuted instantiation: ractor.c:ccan_list_del_ Unexecuted instantiation: random.c:ccan_list_del_ Unexecuted instantiation: rational.c:ccan_list_del_ Unexecuted instantiation: re.c:ccan_list_del_ Unexecuted instantiation: ruby.c:ccan_list_del_ Unexecuted instantiation: scheduler.c:ccan_list_del_ Unexecuted instantiation: set.c:ccan_list_del_ Unexecuted instantiation: shape.c:ccan_list_del_ Unexecuted instantiation: signal.c:ccan_list_del_ Unexecuted instantiation: st.c:ccan_list_del_ Unexecuted instantiation: string.c:ccan_list_del_ Unexecuted instantiation: struct.c:ccan_list_del_ Unexecuted instantiation: symbol.c:ccan_list_del_ Line | Count | Source | 271 | 35 | { | 272 | 35 | (void)ccan_list_debug_node(n, abortstr); | 273 | 35 | n->next->prev = n->prev; | 274 | 35 | n->prev->next = n->next; | 275 | | #ifdef CCAN_LIST_DEBUG | 276 | | /* Catch use-after-del. */ | 277 | | n->next = n->prev = NULL; | 278 | | #endif | 279 | 35 | } |
Unexecuted instantiation: time.c:ccan_list_del_ Unexecuted instantiation: transcode.c:ccan_list_del_ Unexecuted instantiation: variable.c:ccan_list_del_ Unexecuted instantiation: version.c:ccan_list_del_ Unexecuted instantiation: vm.c:ccan_list_del_ Unexecuted instantiation: vm_backtrace.c:ccan_list_del_ Unexecuted instantiation: vm_dump.c:ccan_list_del_ Unexecuted instantiation: vm_sync.c:ccan_list_del_ Unexecuted instantiation: vm_trace.c:ccan_list_del_ Unexecuted instantiation: weakmap.c:ccan_list_del_ Unexecuted instantiation: builtin.c:ccan_list_del_ Unexecuted instantiation: ast.c:ccan_list_del_ Unexecuted instantiation: box.c:ccan_list_del_ Unexecuted instantiation: compile.c:ccan_list_del_ Unexecuted instantiation: concurrent_set.c:ccan_list_del_ Unexecuted instantiation: cont.c:ccan_list_del_ Unexecuted instantiation: debug.c:ccan_list_del_ Unexecuted instantiation: dir.c:ccan_list_del_ Unexecuted instantiation: parse.c:ccan_list_del_ |
280 | | |
281 | | /** |
282 | | * ccan_list_del_init - delete a node, and reset it so it can be deleted again. |
283 | | * @n: the ccan_list_node to be deleted. |
284 | | * |
285 | | * ccan_list_del(@n) or ccan_list_del_init() again after this will be safe, |
286 | | * which can be useful in some cases. |
287 | | * |
288 | | * See also: |
289 | | * ccan_list_del_from(), ccan_list_del() |
290 | | * |
291 | | * Example: |
292 | | * ccan_list_del_init(&child->list); |
293 | | * parent->num_children--; |
294 | | */ |
295 | 35 | #define ccan_list_del_init(n) ccan_list_del_init_(n, CCAN_LIST_LOC) |
296 | | static inline void ccan_list_del_init_(struct ccan_list_node *n, const char *abortstr) |
297 | 35 | { |
298 | 35 | ccan_list_del_(n, abortstr); |
299 | 35 | ccan_list_node_init(n); |
300 | 35 | } Unexecuted instantiation: array.c:ccan_list_del_init_ Unexecuted instantiation: bignum.c:ccan_list_del_init_ Unexecuted instantiation: class.c:ccan_list_del_init_ Unexecuted instantiation: complex.c:ccan_list_del_init_ Unexecuted instantiation: enumerator.c:ccan_list_del_init_ Unexecuted instantiation: error.c:ccan_list_del_init_ Unexecuted instantiation: eval.c:ccan_list_del_init_ Unexecuted instantiation: file.c:ccan_list_del_init_ Unexecuted instantiation: gc.c:ccan_list_del_init_ Unexecuted instantiation: hash.c:ccan_list_del_init_ Unexecuted instantiation: imemo.c:ccan_list_del_init_ Unexecuted instantiation: io.c:ccan_list_del_init_ Unexecuted instantiation: io_buffer.c:ccan_list_del_init_ Unexecuted instantiation: iseq.c:ccan_list_del_init_ Unexecuted instantiation: load.c:ccan_list_del_init_ Unexecuted instantiation: marshal.c:ccan_list_del_init_ Unexecuted instantiation: memory_view.c:ccan_list_del_init_ Unexecuted instantiation: node.c:ccan_list_del_init_ Unexecuted instantiation: node_dump.c:ccan_list_del_init_ Unexecuted instantiation: numeric.c:ccan_list_del_init_ Unexecuted instantiation: object.c:ccan_list_del_init_ Unexecuted instantiation: pack.c:ccan_list_del_init_ Unexecuted instantiation: proc.c:ccan_list_del_init_ Unexecuted instantiation: process.c:ccan_list_del_init_ Unexecuted instantiation: ractor.c:ccan_list_del_init_ Unexecuted instantiation: random.c:ccan_list_del_init_ Unexecuted instantiation: rational.c:ccan_list_del_init_ Unexecuted instantiation: re.c:ccan_list_del_init_ Unexecuted instantiation: ruby.c:ccan_list_del_init_ Unexecuted instantiation: scheduler.c:ccan_list_del_init_ Unexecuted instantiation: set.c:ccan_list_del_init_ Unexecuted instantiation: shape.c:ccan_list_del_init_ Unexecuted instantiation: signal.c:ccan_list_del_init_ Unexecuted instantiation: st.c:ccan_list_del_init_ Unexecuted instantiation: string.c:ccan_list_del_init_ Unexecuted instantiation: struct.c:ccan_list_del_init_ Unexecuted instantiation: symbol.c:ccan_list_del_init_ thread.c:ccan_list_del_init_ Line | Count | Source | 297 | 35 | { | 298 | 35 | ccan_list_del_(n, abortstr); | 299 | 35 | ccan_list_node_init(n); | 300 | 35 | } |
Unexecuted instantiation: time.c:ccan_list_del_init_ Unexecuted instantiation: transcode.c:ccan_list_del_init_ Unexecuted instantiation: variable.c:ccan_list_del_init_ Unexecuted instantiation: version.c:ccan_list_del_init_ Unexecuted instantiation: vm.c:ccan_list_del_init_ Unexecuted instantiation: vm_backtrace.c:ccan_list_del_init_ Unexecuted instantiation: vm_dump.c:ccan_list_del_init_ Unexecuted instantiation: vm_sync.c:ccan_list_del_init_ Unexecuted instantiation: vm_trace.c:ccan_list_del_init_ Unexecuted instantiation: weakmap.c:ccan_list_del_init_ Unexecuted instantiation: builtin.c:ccan_list_del_init_ Unexecuted instantiation: ast.c:ccan_list_del_init_ Unexecuted instantiation: box.c:ccan_list_del_init_ Unexecuted instantiation: compile.c:ccan_list_del_init_ Unexecuted instantiation: concurrent_set.c:ccan_list_del_init_ Unexecuted instantiation: cont.c:ccan_list_del_init_ Unexecuted instantiation: debug.c:ccan_list_del_init_ Unexecuted instantiation: dir.c:ccan_list_del_init_ Unexecuted instantiation: parse.c:ccan_list_del_init_ |
301 | | |
302 | | /** |
303 | | * ccan_list_del_from - delete an entry from a known linked list. |
304 | | * @h: the ccan_list_head the node is in. |
305 | | * @n: the ccan_list_node to delete from the list. |
306 | | * |
307 | | * This explicitly indicates which list a node is expected to be in, |
308 | | * which is better documentation and can catch more bugs. |
309 | | * |
310 | | * See also: ccan_list_del() |
311 | | * |
312 | | * Example: |
313 | | * ccan_list_del_from(&parent->children, &child->list); |
314 | | * parent->num_children--; |
315 | | */ |
316 | | static inline void ccan_list_del_from(struct ccan_list_head *h, struct ccan_list_node *n) |
317 | 0 | { |
318 | 0 | #ifdef CCAN_LIST_DEBUG |
319 | 0 | { |
320 | 0 | /* Thorough check: make sure it was in list! */ |
321 | 0 | struct ccan_list_node *i; |
322 | 0 | for (i = h->n.next; i != n; i = i->next) |
323 | 0 | assert(i != &h->n); |
324 | 0 | } |
325 | 0 | #endif /* CCAN_LIST_DEBUG */ |
326 | 0 |
|
327 | 0 | /* Quick test that catches a surprising number of bugs. */ |
328 | 0 | assert(!ccan_list_empty(h)); |
329 | 0 | ccan_list_del(n); |
330 | 0 | } Unexecuted instantiation: array.c:ccan_list_del_from Unexecuted instantiation: bignum.c:ccan_list_del_from Unexecuted instantiation: class.c:ccan_list_del_from Unexecuted instantiation: complex.c:ccan_list_del_from Unexecuted instantiation: enumerator.c:ccan_list_del_from Unexecuted instantiation: error.c:ccan_list_del_from Unexecuted instantiation: eval.c:ccan_list_del_from Unexecuted instantiation: file.c:ccan_list_del_from Unexecuted instantiation: gc.c:ccan_list_del_from Unexecuted instantiation: hash.c:ccan_list_del_from Unexecuted instantiation: imemo.c:ccan_list_del_from Unexecuted instantiation: io.c:ccan_list_del_from Unexecuted instantiation: io_buffer.c:ccan_list_del_from Unexecuted instantiation: iseq.c:ccan_list_del_from Unexecuted instantiation: load.c:ccan_list_del_from Unexecuted instantiation: marshal.c:ccan_list_del_from Unexecuted instantiation: memory_view.c:ccan_list_del_from Unexecuted instantiation: node.c:ccan_list_del_from Unexecuted instantiation: node_dump.c:ccan_list_del_from Unexecuted instantiation: numeric.c:ccan_list_del_from Unexecuted instantiation: object.c:ccan_list_del_from Unexecuted instantiation: pack.c:ccan_list_del_from Unexecuted instantiation: proc.c:ccan_list_del_from Unexecuted instantiation: process.c:ccan_list_del_from Unexecuted instantiation: ractor.c:ccan_list_del_from Unexecuted instantiation: random.c:ccan_list_del_from Unexecuted instantiation: rational.c:ccan_list_del_from Unexecuted instantiation: re.c:ccan_list_del_from Unexecuted instantiation: ruby.c:ccan_list_del_from Unexecuted instantiation: scheduler.c:ccan_list_del_from Unexecuted instantiation: set.c:ccan_list_del_from Unexecuted instantiation: shape.c:ccan_list_del_from Unexecuted instantiation: signal.c:ccan_list_del_from Unexecuted instantiation: st.c:ccan_list_del_from Unexecuted instantiation: string.c:ccan_list_del_from Unexecuted instantiation: struct.c:ccan_list_del_from Unexecuted instantiation: symbol.c:ccan_list_del_from Unexecuted instantiation: thread.c:ccan_list_del_from Unexecuted instantiation: time.c:ccan_list_del_from Unexecuted instantiation: transcode.c:ccan_list_del_from Unexecuted instantiation: variable.c:ccan_list_del_from Unexecuted instantiation: version.c:ccan_list_del_from Unexecuted instantiation: vm.c:ccan_list_del_from Unexecuted instantiation: vm_backtrace.c:ccan_list_del_from Unexecuted instantiation: vm_dump.c:ccan_list_del_from Unexecuted instantiation: vm_sync.c:ccan_list_del_from Unexecuted instantiation: vm_trace.c:ccan_list_del_from Unexecuted instantiation: weakmap.c:ccan_list_del_from Unexecuted instantiation: builtin.c:ccan_list_del_from Unexecuted instantiation: ast.c:ccan_list_del_from Unexecuted instantiation: box.c:ccan_list_del_from Unexecuted instantiation: compile.c:ccan_list_del_from Unexecuted instantiation: concurrent_set.c:ccan_list_del_from Unexecuted instantiation: cont.c:ccan_list_del_from Unexecuted instantiation: debug.c:ccan_list_del_from Unexecuted instantiation: dir.c:ccan_list_del_from Unexecuted instantiation: parse.c:ccan_list_del_from |
331 | | |
332 | | /** |
333 | | * ccan_list_swap - swap out an entry from an (unknown) linked list for a new one. |
334 | | * @o: the ccan_list_node to replace from the list. |
335 | | * @n: the ccan_list_node to insert in place of the old one. |
336 | | * |
337 | | * Note that this leaves @o in an undefined state; it can be added to |
338 | | * another list, but not deleted/swapped again. |
339 | | * |
340 | | * See also: |
341 | | * ccan_list_del() |
342 | | * |
343 | | * Example: |
344 | | * struct child x1, x2; |
345 | | * CCAN_LIST_HEAD(xh); |
346 | | * |
347 | | * ccan_list_add(&xh, &x1.list); |
348 | | * ccan_list_swap(&x1.list, &x2.list); |
349 | | */ |
350 | | #define ccan_list_swap(o, n) ccan_list_swap_(o, n, CCAN_LIST_LOC) |
351 | | static inline void ccan_list_swap_(struct ccan_list_node *o, |
352 | | struct ccan_list_node *n, |
353 | | const char* abortstr) |
354 | 0 | { |
355 | 0 | (void)ccan_list_debug_node(o, abortstr); |
356 | 0 | *n = *o; |
357 | 0 | n->next->prev = n; |
358 | 0 | n->prev->next = n; |
359 | 0 | #ifdef CCAN_LIST_DEBUG |
360 | 0 | /* Catch use-after-del. */ |
361 | 0 | o->next = o->prev = NULL; |
362 | 0 | #endif |
363 | 0 | } Unexecuted instantiation: array.c:ccan_list_swap_ Unexecuted instantiation: bignum.c:ccan_list_swap_ Unexecuted instantiation: class.c:ccan_list_swap_ Unexecuted instantiation: complex.c:ccan_list_swap_ Unexecuted instantiation: enumerator.c:ccan_list_swap_ Unexecuted instantiation: error.c:ccan_list_swap_ Unexecuted instantiation: eval.c:ccan_list_swap_ Unexecuted instantiation: file.c:ccan_list_swap_ Unexecuted instantiation: gc.c:ccan_list_swap_ Unexecuted instantiation: hash.c:ccan_list_swap_ Unexecuted instantiation: imemo.c:ccan_list_swap_ Unexecuted instantiation: io.c:ccan_list_swap_ Unexecuted instantiation: io_buffer.c:ccan_list_swap_ Unexecuted instantiation: iseq.c:ccan_list_swap_ Unexecuted instantiation: load.c:ccan_list_swap_ Unexecuted instantiation: marshal.c:ccan_list_swap_ Unexecuted instantiation: memory_view.c:ccan_list_swap_ Unexecuted instantiation: node.c:ccan_list_swap_ Unexecuted instantiation: node_dump.c:ccan_list_swap_ Unexecuted instantiation: numeric.c:ccan_list_swap_ Unexecuted instantiation: object.c:ccan_list_swap_ Unexecuted instantiation: pack.c:ccan_list_swap_ Unexecuted instantiation: proc.c:ccan_list_swap_ Unexecuted instantiation: process.c:ccan_list_swap_ Unexecuted instantiation: ractor.c:ccan_list_swap_ Unexecuted instantiation: random.c:ccan_list_swap_ Unexecuted instantiation: rational.c:ccan_list_swap_ Unexecuted instantiation: re.c:ccan_list_swap_ Unexecuted instantiation: ruby.c:ccan_list_swap_ Unexecuted instantiation: scheduler.c:ccan_list_swap_ Unexecuted instantiation: set.c:ccan_list_swap_ Unexecuted instantiation: shape.c:ccan_list_swap_ Unexecuted instantiation: signal.c:ccan_list_swap_ Unexecuted instantiation: st.c:ccan_list_swap_ Unexecuted instantiation: string.c:ccan_list_swap_ Unexecuted instantiation: struct.c:ccan_list_swap_ Unexecuted instantiation: symbol.c:ccan_list_swap_ Unexecuted instantiation: thread.c:ccan_list_swap_ Unexecuted instantiation: time.c:ccan_list_swap_ Unexecuted instantiation: transcode.c:ccan_list_swap_ Unexecuted instantiation: variable.c:ccan_list_swap_ Unexecuted instantiation: version.c:ccan_list_swap_ Unexecuted instantiation: vm.c:ccan_list_swap_ Unexecuted instantiation: vm_backtrace.c:ccan_list_swap_ Unexecuted instantiation: vm_dump.c:ccan_list_swap_ Unexecuted instantiation: vm_sync.c:ccan_list_swap_ Unexecuted instantiation: vm_trace.c:ccan_list_swap_ Unexecuted instantiation: weakmap.c:ccan_list_swap_ Unexecuted instantiation: builtin.c:ccan_list_swap_ Unexecuted instantiation: ast.c:ccan_list_swap_ Unexecuted instantiation: box.c:ccan_list_swap_ Unexecuted instantiation: compile.c:ccan_list_swap_ Unexecuted instantiation: concurrent_set.c:ccan_list_swap_ Unexecuted instantiation: cont.c:ccan_list_swap_ Unexecuted instantiation: debug.c:ccan_list_swap_ Unexecuted instantiation: dir.c:ccan_list_swap_ Unexecuted instantiation: parse.c:ccan_list_swap_ |
364 | | |
365 | | /** |
366 | | * ccan_list_entry - convert a ccan_list_node back into the structure containing it. |
367 | | * @n: the ccan_list_node |
368 | | * @type: the type of the entry |
369 | | * @member: the ccan_list_node member of the type |
370 | | * |
371 | | * Example: |
372 | | * // First list entry is children.next; convert back to child. |
373 | | * child = ccan_list_entry(parent->children.n.next, struct child, list); |
374 | | * |
375 | | * See Also: |
376 | | * ccan_list_top(), ccan_list_for_each() |
377 | | */ |
378 | | #define ccan_list_entry(n, type, member) ccan_container_of(n, type, member) |
379 | | |
380 | | /** |
381 | | * ccan_list_top - get the first entry in a list |
382 | | * @h: the ccan_list_head |
383 | | * @type: the type of the entry |
384 | | * @member: the ccan_list_node member of the type |
385 | | * |
386 | | * If the list is empty, returns NULL. |
387 | | * |
388 | | * Example: |
389 | | * struct child *first; |
390 | | * first = ccan_list_top(&parent->children, struct child, list); |
391 | | * if (!first) |
392 | | * printf("Empty list!\n"); |
393 | | */ |
394 | | #define ccan_list_top(h, type, member) \ |
395 | 227k | ((type *)ccan_list_top_((h), ccan_list_off_(type, member))) |
396 | | |
397 | | static inline const void *ccan_list_top_(const struct ccan_list_head *h, size_t off) |
398 | 227k | { |
399 | 227k | if (ccan_list_empty(h)) |
400 | 50.1k | return NULL; |
401 | 177k | return (const char *)h->n.next - off; |
402 | 227k | } Unexecuted instantiation: array.c:ccan_list_top_ Unexecuted instantiation: bignum.c:ccan_list_top_ Unexecuted instantiation: class.c:ccan_list_top_ Unexecuted instantiation: complex.c:ccan_list_top_ Unexecuted instantiation: enumerator.c:ccan_list_top_ Unexecuted instantiation: error.c:ccan_list_top_ Unexecuted instantiation: eval.c:ccan_list_top_ Unexecuted instantiation: file.c:ccan_list_top_ Line | Count | Source | 398 | 227k | { | 399 | 227k | if (ccan_list_empty(h)) | 400 | 50.1k | return NULL; | 401 | 177k | return (const char *)h->n.next - off; | 402 | 227k | } |
Unexecuted instantiation: hash.c:ccan_list_top_ Unexecuted instantiation: imemo.c:ccan_list_top_ Unexecuted instantiation: io.c:ccan_list_top_ Unexecuted instantiation: io_buffer.c:ccan_list_top_ Unexecuted instantiation: iseq.c:ccan_list_top_ Unexecuted instantiation: load.c:ccan_list_top_ Unexecuted instantiation: marshal.c:ccan_list_top_ Unexecuted instantiation: memory_view.c:ccan_list_top_ Unexecuted instantiation: node.c:ccan_list_top_ Unexecuted instantiation: node_dump.c:ccan_list_top_ Unexecuted instantiation: numeric.c:ccan_list_top_ Unexecuted instantiation: object.c:ccan_list_top_ Unexecuted instantiation: pack.c:ccan_list_top_ Unexecuted instantiation: proc.c:ccan_list_top_ Unexecuted instantiation: process.c:ccan_list_top_ Unexecuted instantiation: ractor.c:ccan_list_top_ Unexecuted instantiation: random.c:ccan_list_top_ Unexecuted instantiation: rational.c:ccan_list_top_ Unexecuted instantiation: re.c:ccan_list_top_ Unexecuted instantiation: ruby.c:ccan_list_top_ Unexecuted instantiation: scheduler.c:ccan_list_top_ Unexecuted instantiation: set.c:ccan_list_top_ Unexecuted instantiation: shape.c:ccan_list_top_ Unexecuted instantiation: signal.c:ccan_list_top_ Unexecuted instantiation: st.c:ccan_list_top_ Unexecuted instantiation: string.c:ccan_list_top_ Unexecuted instantiation: struct.c:ccan_list_top_ Unexecuted instantiation: symbol.c:ccan_list_top_ Line | Count | Source | 398 | 18 | { | 399 | 18 | if (ccan_list_empty(h)) | 400 | 18 | return NULL; | 401 | 0 | return (const char *)h->n.next - off; | 402 | 18 | } |
Unexecuted instantiation: time.c:ccan_list_top_ Unexecuted instantiation: transcode.c:ccan_list_top_ Unexecuted instantiation: variable.c:ccan_list_top_ Unexecuted instantiation: version.c:ccan_list_top_ Unexecuted instantiation: vm.c:ccan_list_top_ Unexecuted instantiation: vm_backtrace.c:ccan_list_top_ Unexecuted instantiation: vm_dump.c:ccan_list_top_ Unexecuted instantiation: vm_sync.c:ccan_list_top_ Unexecuted instantiation: vm_trace.c:ccan_list_top_ Unexecuted instantiation: weakmap.c:ccan_list_top_ Unexecuted instantiation: builtin.c:ccan_list_top_ Unexecuted instantiation: ast.c:ccan_list_top_ Unexecuted instantiation: box.c:ccan_list_top_ Unexecuted instantiation: compile.c:ccan_list_top_ Unexecuted instantiation: concurrent_set.c:ccan_list_top_ Unexecuted instantiation: cont.c:ccan_list_top_ Unexecuted instantiation: debug.c:ccan_list_top_ Unexecuted instantiation: dir.c:ccan_list_top_ Unexecuted instantiation: parse.c:ccan_list_top_ |
403 | | |
404 | | /** |
405 | | * ccan_list_pop - remove the first entry in a list |
406 | | * @h: the ccan_list_head |
407 | | * @type: the type of the entry |
408 | | * @member: the ccan_list_node member of the type |
409 | | * |
410 | | * If the list is empty, returns NULL. |
411 | | * |
412 | | * Example: |
413 | | * struct child *one; |
414 | | * one = ccan_list_pop(&parent->children, struct child, list); |
415 | | * if (!one) |
416 | | * printf("Empty list!\n"); |
417 | | */ |
418 | | #define ccan_list_pop(h, type, member) \ |
419 | 0 | ((type *)ccan_list_pop_((h), ccan_list_off_(type, member))) |
420 | | |
421 | | static inline const void *ccan_list_pop_(const struct ccan_list_head *h, size_t off) |
422 | 0 | { |
423 | 0 | struct ccan_list_node *n; |
424 | |
|
425 | 0 | if (ccan_list_empty(h)) |
426 | 0 | return NULL; |
427 | 0 | n = h->n.next; |
428 | 0 | ccan_list_del(n); |
429 | 0 | return (const char *)n - off; |
430 | 0 | } Unexecuted instantiation: array.c:ccan_list_pop_ Unexecuted instantiation: bignum.c:ccan_list_pop_ Unexecuted instantiation: class.c:ccan_list_pop_ Unexecuted instantiation: complex.c:ccan_list_pop_ Unexecuted instantiation: enumerator.c:ccan_list_pop_ Unexecuted instantiation: error.c:ccan_list_pop_ Unexecuted instantiation: eval.c:ccan_list_pop_ Unexecuted instantiation: file.c:ccan_list_pop_ Unexecuted instantiation: gc.c:ccan_list_pop_ Unexecuted instantiation: hash.c:ccan_list_pop_ Unexecuted instantiation: imemo.c:ccan_list_pop_ Unexecuted instantiation: io.c:ccan_list_pop_ Unexecuted instantiation: io_buffer.c:ccan_list_pop_ Unexecuted instantiation: iseq.c:ccan_list_pop_ Unexecuted instantiation: load.c:ccan_list_pop_ Unexecuted instantiation: marshal.c:ccan_list_pop_ Unexecuted instantiation: memory_view.c:ccan_list_pop_ Unexecuted instantiation: node.c:ccan_list_pop_ Unexecuted instantiation: node_dump.c:ccan_list_pop_ Unexecuted instantiation: numeric.c:ccan_list_pop_ Unexecuted instantiation: object.c:ccan_list_pop_ Unexecuted instantiation: pack.c:ccan_list_pop_ Unexecuted instantiation: proc.c:ccan_list_pop_ Unexecuted instantiation: process.c:ccan_list_pop_ Unexecuted instantiation: ractor.c:ccan_list_pop_ Unexecuted instantiation: random.c:ccan_list_pop_ Unexecuted instantiation: rational.c:ccan_list_pop_ Unexecuted instantiation: re.c:ccan_list_pop_ Unexecuted instantiation: ruby.c:ccan_list_pop_ Unexecuted instantiation: scheduler.c:ccan_list_pop_ Unexecuted instantiation: set.c:ccan_list_pop_ Unexecuted instantiation: shape.c:ccan_list_pop_ Unexecuted instantiation: signal.c:ccan_list_pop_ Unexecuted instantiation: st.c:ccan_list_pop_ Unexecuted instantiation: string.c:ccan_list_pop_ Unexecuted instantiation: struct.c:ccan_list_pop_ Unexecuted instantiation: symbol.c:ccan_list_pop_ Unexecuted instantiation: thread.c:ccan_list_pop_ Unexecuted instantiation: time.c:ccan_list_pop_ Unexecuted instantiation: transcode.c:ccan_list_pop_ Unexecuted instantiation: variable.c:ccan_list_pop_ Unexecuted instantiation: version.c:ccan_list_pop_ Unexecuted instantiation: vm.c:ccan_list_pop_ Unexecuted instantiation: vm_backtrace.c:ccan_list_pop_ Unexecuted instantiation: vm_dump.c:ccan_list_pop_ Unexecuted instantiation: vm_sync.c:ccan_list_pop_ Unexecuted instantiation: vm_trace.c:ccan_list_pop_ Unexecuted instantiation: weakmap.c:ccan_list_pop_ Unexecuted instantiation: builtin.c:ccan_list_pop_ Unexecuted instantiation: ast.c:ccan_list_pop_ Unexecuted instantiation: box.c:ccan_list_pop_ Unexecuted instantiation: compile.c:ccan_list_pop_ Unexecuted instantiation: concurrent_set.c:ccan_list_pop_ Unexecuted instantiation: cont.c:ccan_list_pop_ Unexecuted instantiation: debug.c:ccan_list_pop_ Unexecuted instantiation: dir.c:ccan_list_pop_ Unexecuted instantiation: parse.c:ccan_list_pop_ |
431 | | |
432 | | /** |
433 | | * ccan_list_tail - get the last entry in a list |
434 | | * @h: the ccan_list_head |
435 | | * @type: the type of the entry |
436 | | * @member: the ccan_list_node member of the type |
437 | | * |
438 | | * If the list is empty, returns NULL. |
439 | | * |
440 | | * Example: |
441 | | * struct child *last; |
442 | | * last = ccan_list_tail(&parent->children, struct child, list); |
443 | | * if (!last) |
444 | | * printf("Empty list!\n"); |
445 | | */ |
446 | | #define ccan_list_tail(h, type, member) \ |
447 | 0 | ((type *)ccan_list_tail_((h), ccan_list_off_(type, member))) |
448 | | |
449 | | static inline const void *ccan_list_tail_(const struct ccan_list_head *h, size_t off) |
450 | 0 | { |
451 | 0 | if (ccan_list_empty(h)) |
452 | 0 | return NULL; |
453 | 0 | return (const char *)h->n.prev - off; |
454 | 0 | } Unexecuted instantiation: array.c:ccan_list_tail_ Unexecuted instantiation: bignum.c:ccan_list_tail_ Unexecuted instantiation: class.c:ccan_list_tail_ Unexecuted instantiation: complex.c:ccan_list_tail_ Unexecuted instantiation: enumerator.c:ccan_list_tail_ Unexecuted instantiation: error.c:ccan_list_tail_ Unexecuted instantiation: eval.c:ccan_list_tail_ Unexecuted instantiation: file.c:ccan_list_tail_ Unexecuted instantiation: gc.c:ccan_list_tail_ Unexecuted instantiation: hash.c:ccan_list_tail_ Unexecuted instantiation: imemo.c:ccan_list_tail_ Unexecuted instantiation: io.c:ccan_list_tail_ Unexecuted instantiation: io_buffer.c:ccan_list_tail_ Unexecuted instantiation: iseq.c:ccan_list_tail_ Unexecuted instantiation: load.c:ccan_list_tail_ Unexecuted instantiation: marshal.c:ccan_list_tail_ Unexecuted instantiation: memory_view.c:ccan_list_tail_ Unexecuted instantiation: node.c:ccan_list_tail_ Unexecuted instantiation: node_dump.c:ccan_list_tail_ Unexecuted instantiation: numeric.c:ccan_list_tail_ Unexecuted instantiation: object.c:ccan_list_tail_ Unexecuted instantiation: pack.c:ccan_list_tail_ Unexecuted instantiation: proc.c:ccan_list_tail_ Unexecuted instantiation: process.c:ccan_list_tail_ Unexecuted instantiation: ractor.c:ccan_list_tail_ Unexecuted instantiation: random.c:ccan_list_tail_ Unexecuted instantiation: rational.c:ccan_list_tail_ Unexecuted instantiation: re.c:ccan_list_tail_ Unexecuted instantiation: ruby.c:ccan_list_tail_ Unexecuted instantiation: scheduler.c:ccan_list_tail_ Unexecuted instantiation: set.c:ccan_list_tail_ Unexecuted instantiation: shape.c:ccan_list_tail_ Unexecuted instantiation: signal.c:ccan_list_tail_ Unexecuted instantiation: st.c:ccan_list_tail_ Unexecuted instantiation: string.c:ccan_list_tail_ Unexecuted instantiation: struct.c:ccan_list_tail_ Unexecuted instantiation: symbol.c:ccan_list_tail_ Unexecuted instantiation: thread.c:ccan_list_tail_ Unexecuted instantiation: time.c:ccan_list_tail_ Unexecuted instantiation: transcode.c:ccan_list_tail_ Unexecuted instantiation: variable.c:ccan_list_tail_ Unexecuted instantiation: version.c:ccan_list_tail_ Unexecuted instantiation: vm.c:ccan_list_tail_ Unexecuted instantiation: vm_backtrace.c:ccan_list_tail_ Unexecuted instantiation: vm_dump.c:ccan_list_tail_ Unexecuted instantiation: vm_sync.c:ccan_list_tail_ Unexecuted instantiation: vm_trace.c:ccan_list_tail_ Unexecuted instantiation: weakmap.c:ccan_list_tail_ Unexecuted instantiation: builtin.c:ccan_list_tail_ Unexecuted instantiation: ast.c:ccan_list_tail_ Unexecuted instantiation: box.c:ccan_list_tail_ Unexecuted instantiation: compile.c:ccan_list_tail_ Unexecuted instantiation: concurrent_set.c:ccan_list_tail_ Unexecuted instantiation: cont.c:ccan_list_tail_ Unexecuted instantiation: debug.c:ccan_list_tail_ Unexecuted instantiation: dir.c:ccan_list_tail_ Unexecuted instantiation: parse.c:ccan_list_tail_ |
455 | | |
456 | | /** |
457 | | * ccan_list_for_each - iterate through a list. |
458 | | * @h: the ccan_list_head (warning: evaluated multiple times!) |
459 | | * @i: the structure containing the ccan_list_node |
460 | | * @member: the ccan_list_node member of the structure |
461 | | * |
462 | | * This is a convenient wrapper to iterate @i over the entire list. It's |
463 | | * a for loop, so you can break and continue as normal. |
464 | | * |
465 | | * Example: |
466 | | * ccan_list_for_each(&parent->children, child, list) |
467 | | * printf("Name: %s\n", child->name); |
468 | | */ |
469 | | #define ccan_list_for_each(h, i, member) \ |
470 | 500k | ccan_list_for_each_off(h, i, ccan_list_off_var_(i, member)) |
471 | | |
472 | | /** |
473 | | * ccan_list_for_each_rev - iterate through a list backwards. |
474 | | * @h: the ccan_list_head |
475 | | * @i: the structure containing the ccan_list_node |
476 | | * @member: the ccan_list_node member of the structure |
477 | | * |
478 | | * This is a convenient wrapper to iterate @i over the entire list. It's |
479 | | * a for loop, so you can break and continue as normal. |
480 | | * |
481 | | * Example: |
482 | | * ccan_list_for_each_rev(&parent->children, child, list) |
483 | | * printf("Name: %s\n", child->name); |
484 | | */ |
485 | | #define ccan_list_for_each_rev(h, i, member) \ |
486 | | ccan_list_for_each_rev_off(h, i, ccan_list_off_var_(i, member)) |
487 | | |
488 | | /** |
489 | | * ccan_list_for_each_rev_safe - iterate through a list backwards, |
490 | | * maybe during deletion |
491 | | * @h: the ccan_list_head |
492 | | * @i: the structure containing the ccan_list_node |
493 | | * @nxt: the structure containing the ccan_list_node |
494 | | * @member: the ccan_list_node member of the structure |
495 | | * |
496 | | * This is a convenient wrapper to iterate @i over the entire list backwards. |
497 | | * It's a for loop, so you can break and continue as normal. The extra |
498 | | * variable * @nxt is used to hold the next element, so you can delete @i |
499 | | * from the list. |
500 | | * |
501 | | * Example: |
502 | | * struct child *next; |
503 | | * ccan_list_for_each_rev_safe(&parent->children, child, next, list) { |
504 | | * printf("Name: %s\n", child->name); |
505 | | * } |
506 | | */ |
507 | | #define ccan_list_for_each_rev_safe(h, i, nxt, member) \ |
508 | | ccan_list_for_each_rev_safe_off(h, i, nxt, ccan_list_off_var_(i, member)) |
509 | | |
510 | | /** |
511 | | * ccan_list_for_each_safe - iterate through a list, maybe during deletion |
512 | | * @h: the ccan_list_head |
513 | | * @i: the structure containing the ccan_list_node |
514 | | * @nxt: the structure containing the ccan_list_node |
515 | | * @member: the ccan_list_node member of the structure |
516 | | * |
517 | | * This is a convenient wrapper to iterate @i over the entire list. It's |
518 | | * a for loop, so you can break and continue as normal. The extra variable |
519 | | * @nxt is used to hold the next element, so you can delete @i from the list. |
520 | | * |
521 | | * Example: |
522 | | * ccan_list_for_each_safe(&parent->children, child, next, list) { |
523 | | * ccan_list_del(&child->list); |
524 | | * parent->num_children--; |
525 | | * } |
526 | | */ |
527 | | #define ccan_list_for_each_safe(h, i, nxt, member) \ |
528 | 0 | ccan_list_for_each_safe_off(h, i, nxt, ccan_list_off_var_(i, member)) |
529 | | |
530 | | /** |
531 | | * ccan_list_next - get the next entry in a list |
532 | | * @h: the ccan_list_head |
533 | | * @i: a pointer to an entry in the list. |
534 | | * @member: the ccan_list_node member of the structure |
535 | | * |
536 | | * If @i was the last entry in the list, returns NULL. |
537 | | * |
538 | | * Example: |
539 | | * struct child *second; |
540 | | * second = ccan_list_next(&parent->children, first, list); |
541 | | * if (!second) |
542 | | * printf("No second child!\n"); |
543 | | */ |
544 | | #define ccan_list_next(h, i, member) \ |
545 | 486k | ((ccan_list_typeof(i))ccan_list_entry_or_null(ccan_list_debug(h, \ |
546 | 486k | __FILE__ ":" ccan_stringify(__LINE__)), \ |
547 | 486k | (i)->member.next, \ |
548 | 486k | ccan_list_off_var_((i), member))) |
549 | | |
550 | | /** |
551 | | * ccan_list_prev - get the previous entry in a list |
552 | | * @h: the ccan_list_head |
553 | | * @i: a pointer to an entry in the list. |
554 | | * @member: the ccan_list_node member of the structure |
555 | | * |
556 | | * If @i was the first entry in the list, returns NULL. |
557 | | * |
558 | | * Example: |
559 | | * first = ccan_list_prev(&parent->children, second, list); |
560 | | * if (!first) |
561 | | * printf("Can't go back to first child?!\n"); |
562 | | */ |
563 | | #define ccan_list_prev(h, i, member) \ |
564 | 0 | ((ccan_list_typeof(i))ccan_list_entry_or_null(ccan_list_debug(h, \ |
565 | 0 | __FILE__ ":" ccan_stringify(__LINE__)), \ |
566 | 0 | (i)->member.prev, \ |
567 | 0 | ccan_list_off_var_((i), member))) |
568 | | |
569 | | /** |
570 | | * ccan_list_append_list - empty one list onto the end of another. |
571 | | * @to: the list to append into |
572 | | * @from: the list to empty. |
573 | | * |
574 | | * This takes the entire contents of @from and moves it to the end of |
575 | | * @to. After this @from will be empty. |
576 | | * |
577 | | * Example: |
578 | | * struct ccan_list_head adopter; |
579 | | * |
580 | | * ccan_list_append_list(&adopter, &parent->children); |
581 | | * assert(ccan_list_empty(&parent->children)); |
582 | | * parent->num_children = 0; |
583 | | */ |
584 | 0 | #define ccan_list_append_list(t, f) ccan_list_append_list_(t, f, \ |
585 | 0 | __FILE__ ":" ccan_stringify(__LINE__)) |
586 | | static inline void ccan_list_append_list_(struct ccan_list_head *to, |
587 | | struct ccan_list_head *from, |
588 | | const char *abortstr) |
589 | 0 | { |
590 | 0 | struct ccan_list_node *from_tail = ccan_list_debug(from, abortstr)->n.prev; |
591 | 0 | struct ccan_list_node *to_tail = ccan_list_debug(to, abortstr)->n.prev; |
592 | | |
593 | | /* Sew in head and entire list. */ |
594 | 0 | to->n.prev = from_tail; |
595 | 0 | from_tail->next = &to->n; |
596 | 0 | to_tail->next = &from->n; |
597 | 0 | from->n.prev = to_tail; |
598 | | |
599 | | /* Now remove head. */ |
600 | 0 | ccan_list_del(&from->n); |
601 | 0 | ccan_list_head_init(from); |
602 | 0 | } Unexecuted instantiation: array.c:ccan_list_append_list_ Unexecuted instantiation: bignum.c:ccan_list_append_list_ Unexecuted instantiation: class.c:ccan_list_append_list_ Unexecuted instantiation: complex.c:ccan_list_append_list_ Unexecuted instantiation: enumerator.c:ccan_list_append_list_ Unexecuted instantiation: error.c:ccan_list_append_list_ Unexecuted instantiation: eval.c:ccan_list_append_list_ Unexecuted instantiation: file.c:ccan_list_append_list_ Unexecuted instantiation: gc.c:ccan_list_append_list_ Unexecuted instantiation: hash.c:ccan_list_append_list_ Unexecuted instantiation: imemo.c:ccan_list_append_list_ Unexecuted instantiation: io.c:ccan_list_append_list_ Unexecuted instantiation: io_buffer.c:ccan_list_append_list_ Unexecuted instantiation: iseq.c:ccan_list_append_list_ Unexecuted instantiation: load.c:ccan_list_append_list_ Unexecuted instantiation: marshal.c:ccan_list_append_list_ Unexecuted instantiation: memory_view.c:ccan_list_append_list_ Unexecuted instantiation: node.c:ccan_list_append_list_ Unexecuted instantiation: node_dump.c:ccan_list_append_list_ Unexecuted instantiation: numeric.c:ccan_list_append_list_ Unexecuted instantiation: object.c:ccan_list_append_list_ Unexecuted instantiation: pack.c:ccan_list_append_list_ Unexecuted instantiation: proc.c:ccan_list_append_list_ Unexecuted instantiation: process.c:ccan_list_append_list_ Unexecuted instantiation: ractor.c:ccan_list_append_list_ Unexecuted instantiation: random.c:ccan_list_append_list_ Unexecuted instantiation: rational.c:ccan_list_append_list_ Unexecuted instantiation: re.c:ccan_list_append_list_ Unexecuted instantiation: ruby.c:ccan_list_append_list_ Unexecuted instantiation: scheduler.c:ccan_list_append_list_ Unexecuted instantiation: set.c:ccan_list_append_list_ Unexecuted instantiation: shape.c:ccan_list_append_list_ Unexecuted instantiation: signal.c:ccan_list_append_list_ Unexecuted instantiation: st.c:ccan_list_append_list_ Unexecuted instantiation: string.c:ccan_list_append_list_ Unexecuted instantiation: struct.c:ccan_list_append_list_ Unexecuted instantiation: symbol.c:ccan_list_append_list_ Unexecuted instantiation: thread.c:ccan_list_append_list_ Unexecuted instantiation: time.c:ccan_list_append_list_ Unexecuted instantiation: transcode.c:ccan_list_append_list_ Unexecuted instantiation: variable.c:ccan_list_append_list_ Unexecuted instantiation: version.c:ccan_list_append_list_ Unexecuted instantiation: vm.c:ccan_list_append_list_ Unexecuted instantiation: vm_backtrace.c:ccan_list_append_list_ Unexecuted instantiation: vm_dump.c:ccan_list_append_list_ Unexecuted instantiation: vm_sync.c:ccan_list_append_list_ Unexecuted instantiation: vm_trace.c:ccan_list_append_list_ Unexecuted instantiation: weakmap.c:ccan_list_append_list_ Unexecuted instantiation: builtin.c:ccan_list_append_list_ Unexecuted instantiation: ast.c:ccan_list_append_list_ Unexecuted instantiation: box.c:ccan_list_append_list_ Unexecuted instantiation: compile.c:ccan_list_append_list_ Unexecuted instantiation: concurrent_set.c:ccan_list_append_list_ Unexecuted instantiation: cont.c:ccan_list_append_list_ Unexecuted instantiation: debug.c:ccan_list_append_list_ Unexecuted instantiation: dir.c:ccan_list_append_list_ Unexecuted instantiation: parse.c:ccan_list_append_list_ |
603 | | |
604 | | /** |
605 | | * ccan_list_prepend_list - empty one list into the start of another. |
606 | | * @to: the list to prepend into |
607 | | * @from: the list to empty. |
608 | | * |
609 | | * This takes the entire contents of @from and moves it to the start |
610 | | * of @to. After this @from will be empty. |
611 | | * |
612 | | * Example: |
613 | | * ccan_list_prepend_list(&adopter, &parent->children); |
614 | | * assert(ccan_list_empty(&parent->children)); |
615 | | * parent->num_children = 0; |
616 | | */ |
617 | 0 | #define ccan_list_prepend_list(t, f) ccan_list_prepend_list_(t, f, CCAN_LIST_LOC) |
618 | | static inline void ccan_list_prepend_list_(struct ccan_list_head *to, |
619 | | struct ccan_list_head *from, |
620 | | const char *abortstr) |
621 | 0 | { |
622 | 0 | struct ccan_list_node *from_tail = ccan_list_debug(from, abortstr)->n.prev; |
623 | 0 | struct ccan_list_node *to_head = ccan_list_debug(to, abortstr)->n.next; |
624 | | |
625 | | /* Sew in head and entire list. */ |
626 | 0 | to->n.next = &from->n; |
627 | 0 | from->n.prev = &to->n; |
628 | 0 | to_head->prev = from_tail; |
629 | 0 | from_tail->next = to_head; |
630 | | |
631 | | /* Now remove head. */ |
632 | 0 | ccan_list_del(&from->n); |
633 | 0 | ccan_list_head_init(from); |
634 | 0 | } Unexecuted instantiation: array.c:ccan_list_prepend_list_ Unexecuted instantiation: bignum.c:ccan_list_prepend_list_ Unexecuted instantiation: class.c:ccan_list_prepend_list_ Unexecuted instantiation: complex.c:ccan_list_prepend_list_ Unexecuted instantiation: enumerator.c:ccan_list_prepend_list_ Unexecuted instantiation: error.c:ccan_list_prepend_list_ Unexecuted instantiation: eval.c:ccan_list_prepend_list_ Unexecuted instantiation: file.c:ccan_list_prepend_list_ Unexecuted instantiation: gc.c:ccan_list_prepend_list_ Unexecuted instantiation: hash.c:ccan_list_prepend_list_ Unexecuted instantiation: imemo.c:ccan_list_prepend_list_ Unexecuted instantiation: io.c:ccan_list_prepend_list_ Unexecuted instantiation: io_buffer.c:ccan_list_prepend_list_ Unexecuted instantiation: iseq.c:ccan_list_prepend_list_ Unexecuted instantiation: load.c:ccan_list_prepend_list_ Unexecuted instantiation: marshal.c:ccan_list_prepend_list_ Unexecuted instantiation: memory_view.c:ccan_list_prepend_list_ Unexecuted instantiation: node.c:ccan_list_prepend_list_ Unexecuted instantiation: node_dump.c:ccan_list_prepend_list_ Unexecuted instantiation: numeric.c:ccan_list_prepend_list_ Unexecuted instantiation: object.c:ccan_list_prepend_list_ Unexecuted instantiation: pack.c:ccan_list_prepend_list_ Unexecuted instantiation: proc.c:ccan_list_prepend_list_ Unexecuted instantiation: process.c:ccan_list_prepend_list_ Unexecuted instantiation: ractor.c:ccan_list_prepend_list_ Unexecuted instantiation: random.c:ccan_list_prepend_list_ Unexecuted instantiation: rational.c:ccan_list_prepend_list_ Unexecuted instantiation: re.c:ccan_list_prepend_list_ Unexecuted instantiation: ruby.c:ccan_list_prepend_list_ Unexecuted instantiation: scheduler.c:ccan_list_prepend_list_ Unexecuted instantiation: set.c:ccan_list_prepend_list_ Unexecuted instantiation: shape.c:ccan_list_prepend_list_ Unexecuted instantiation: signal.c:ccan_list_prepend_list_ Unexecuted instantiation: st.c:ccan_list_prepend_list_ Unexecuted instantiation: string.c:ccan_list_prepend_list_ Unexecuted instantiation: struct.c:ccan_list_prepend_list_ Unexecuted instantiation: symbol.c:ccan_list_prepend_list_ Unexecuted instantiation: thread.c:ccan_list_prepend_list_ Unexecuted instantiation: time.c:ccan_list_prepend_list_ Unexecuted instantiation: transcode.c:ccan_list_prepend_list_ Unexecuted instantiation: variable.c:ccan_list_prepend_list_ Unexecuted instantiation: version.c:ccan_list_prepend_list_ Unexecuted instantiation: vm.c:ccan_list_prepend_list_ Unexecuted instantiation: vm_backtrace.c:ccan_list_prepend_list_ Unexecuted instantiation: vm_dump.c:ccan_list_prepend_list_ Unexecuted instantiation: vm_sync.c:ccan_list_prepend_list_ Unexecuted instantiation: vm_trace.c:ccan_list_prepend_list_ Unexecuted instantiation: weakmap.c:ccan_list_prepend_list_ Unexecuted instantiation: builtin.c:ccan_list_prepend_list_ Unexecuted instantiation: ast.c:ccan_list_prepend_list_ Unexecuted instantiation: box.c:ccan_list_prepend_list_ Unexecuted instantiation: compile.c:ccan_list_prepend_list_ Unexecuted instantiation: concurrent_set.c:ccan_list_prepend_list_ Unexecuted instantiation: cont.c:ccan_list_prepend_list_ Unexecuted instantiation: debug.c:ccan_list_prepend_list_ Unexecuted instantiation: dir.c:ccan_list_prepend_list_ Unexecuted instantiation: parse.c:ccan_list_prepend_list_ |
635 | | |
636 | | /* internal macros, do not use directly */ |
637 | | #define ccan_list_for_each_off_dir_(h, i, off, dir) \ |
638 | 500k | for (i = 0, \ |
639 | 500k | i = ccan_list_node_to_off_(ccan_list_debug(h, CCAN_LIST_LOC)->n.dir, \ |
640 | 500k | (off)); \ |
641 | 1.07M | ccan_list_node_from_off_((void *)i, (off)) != &(h)->n; \ |
642 | 577k | i = ccan_list_node_to_off_(ccan_list_node_from_off_((void *)i, (off))->dir, \ |
643 | 577k | (off))) |
644 | | |
645 | | #define ccan_list_for_each_safe_off_dir_(h, i, nxt, off, dir) \ |
646 | 0 | for (i = 0, \ |
647 | 0 | i = ccan_list_node_to_off_(ccan_list_debug(h, CCAN_LIST_LOC)->n.dir, \ |
648 | 0 | (off)), \ |
649 | 0 | nxt = ccan_list_node_to_off_(ccan_list_node_from_off_(i, (off))->dir, \ |
650 | 0 | (off)); \ |
651 | 0 | ccan_list_node_from_off_(i, (off)) != &(h)->n; \ |
652 | 0 | i = nxt, \ |
653 | 0 | nxt = ccan_list_node_to_off_(ccan_list_node_from_off_(i, (off))->dir, \ |
654 | 0 | (off))) |
655 | | |
656 | | /** |
657 | | * ccan_list_for_each_off - iterate through a list of memory regions. |
658 | | * @h: the ccan_list_head |
659 | | * @i: the pointer to a memory region which contains list node data. |
660 | | * @off: offset(relative to @i) at which list node data resides. |
661 | | * |
662 | | * This is a low-level wrapper to iterate @i over the entire list, used to |
663 | | * implement all other, more high-level, for-each constructs. It's a for loop, |
664 | | * so you can break and continue as normal. |
665 | | * |
666 | | * WARNING! Being the low-level macro that it is, this wrapper doesn't know |
667 | | * nor care about the type of @i. The only assumption made is that @i points |
668 | | * to a chunk of memory that at some @offset, relative to @i, contains a |
669 | | * properly filled `struct ccan_list_node' which in turn contains pointers to |
670 | | * memory chunks and it's turtles all the way down. With all that in mind |
671 | | * remember that given the wrong pointer/offset couple this macro will |
672 | | * happily churn all you memory until SEGFAULT stops it, in other words |
673 | | * caveat emptor. |
674 | | * |
675 | | * It is worth mentioning that one of legitimate use-cases for that wrapper |
676 | | * is operation on opaque types with known offset for `struct ccan_list_node' |
677 | | * member(preferably 0), because it allows you not to disclose the type of |
678 | | * @i. |
679 | | * |
680 | | * Example: |
681 | | * ccan_list_for_each_off(&parent->children, child, |
682 | | * offsetof(struct child, list)) |
683 | | * printf("Name: %s\n", child->name); |
684 | | */ |
685 | | #define ccan_list_for_each_off(h, i, off) \ |
686 | 500k | ccan_list_for_each_off_dir_((h),(i),(off),next) |
687 | | |
688 | | /** |
689 | | * ccan_list_for_each_rev_off - iterate through a list of memory regions backwards |
690 | | * @h: the ccan_list_head |
691 | | * @i: the pointer to a memory region which contains list node data. |
692 | | * @off: offset(relative to @i) at which list node data resides. |
693 | | * |
694 | | * See ccan_list_for_each_off for details |
695 | | */ |
696 | | #define ccan_list_for_each_rev_off(h, i, off) \ |
697 | | ccan_list_for_each_off_dir_((h),(i),(off),prev) |
698 | | |
699 | | /** |
700 | | * ccan_list_for_each_safe_off - iterate through a list of memory regions, maybe |
701 | | * during deletion |
702 | | * @h: the ccan_list_head |
703 | | * @i: the pointer to a memory region which contains list node data. |
704 | | * @nxt: the structure containing the ccan_list_node |
705 | | * @off: offset(relative to @i) at which list node data resides. |
706 | | * |
707 | | * For details see `ccan_list_for_each_off' and `ccan_list_for_each_safe' |
708 | | * descriptions. |
709 | | * |
710 | | * Example: |
711 | | * ccan_list_for_each_safe_off(&parent->children, child, |
712 | | * next, offsetof(struct child, list)) |
713 | | * printf("Name: %s\n", child->name); |
714 | | */ |
715 | | #define ccan_list_for_each_safe_off(h, i, nxt, off) \ |
716 | 0 | ccan_list_for_each_safe_off_dir_((h),(i),(nxt),(off),next) |
717 | | |
718 | | /** |
719 | | * ccan_list_for_each_rev_safe_off - iterate backwards through a list of |
720 | | * memory regions, maybe during deletion |
721 | | * @h: the ccan_list_head |
722 | | * @i: the pointer to a memory region which contains list node data. |
723 | | * @nxt: the structure containing the ccan_list_node |
724 | | * @off: offset(relative to @i) at which list node data resides. |
725 | | * |
726 | | * For details see `ccan_list_for_each_rev_off' and `ccan_list_for_each_rev_safe' |
727 | | * descriptions. |
728 | | * |
729 | | * Example: |
730 | | * ccan_list_for_each_rev_safe_off(&parent->children, child, |
731 | | * next, offsetof(struct child, list)) |
732 | | * printf("Name: %s\n", child->name); |
733 | | */ |
734 | | #define ccan_list_for_each_rev_safe_off(h, i, nxt, off) \ |
735 | | ccan_list_for_each_safe_off_dir_((h),(i),(nxt),(off),prev) |
736 | | |
737 | | /* Other -off variants. */ |
738 | | #define ccan_list_entry_off(n, type, off) \ |
739 | | ((type *)ccan_list_node_from_off_((n), (off))) |
740 | | |
741 | | #define ccan_list_head_off(h, type, off) \ |
742 | | ((type *)ccan_list_head_off((h), (off))) |
743 | | |
744 | | #define ccan_list_tail_off(h, type, off) \ |
745 | | ((type *)ccan_list_tail_((h), (off))) |
746 | | |
747 | | #define ccan_list_add_off(h, n, off) \ |
748 | | ccan_list_add((h), ccan_list_node_from_off_((n), (off))) |
749 | | |
750 | | #define ccan_list_del_off(n, off) \ |
751 | | ccan_list_del(ccan_list_node_from_off_((n), (off))) |
752 | | |
753 | | #define ccan_list_del_from_off(h, n, off) \ |
754 | | ccan_list_del_from(h, ccan_list_node_from_off_((n), (off))) |
755 | | |
756 | | /* Offset helper functions so we only single-evaluate. */ |
757 | | static inline void *ccan_list_node_to_off_(struct ccan_list_node *node, size_t off) |
758 | 1.07M | { |
759 | 1.07M | return (void *)((char *)node - off); |
760 | 1.07M | } Unexecuted instantiation: array.c:ccan_list_node_to_off_ Unexecuted instantiation: bignum.c:ccan_list_node_to_off_ Unexecuted instantiation: class.c:ccan_list_node_to_off_ Unexecuted instantiation: complex.c:ccan_list_node_to_off_ Unexecuted instantiation: enumerator.c:ccan_list_node_to_off_ Unexecuted instantiation: error.c:ccan_list_node_to_off_ Unexecuted instantiation: eval.c:ccan_list_node_to_off_ Unexecuted instantiation: file.c:ccan_list_node_to_off_ gc.c:ccan_list_node_to_off_ Line | Count | Source | 758 | 714k | { | 759 | 714k | return (void *)((char *)node - off); | 760 | 714k | } |
Unexecuted instantiation: hash.c:ccan_list_node_to_off_ Unexecuted instantiation: imemo.c:ccan_list_node_to_off_ Unexecuted instantiation: io.c:ccan_list_node_to_off_ Unexecuted instantiation: io_buffer.c:ccan_list_node_to_off_ Unexecuted instantiation: iseq.c:ccan_list_node_to_off_ Unexecuted instantiation: load.c:ccan_list_node_to_off_ Unexecuted instantiation: marshal.c:ccan_list_node_to_off_ Unexecuted instantiation: memory_view.c:ccan_list_node_to_off_ Unexecuted instantiation: node.c:ccan_list_node_to_off_ Unexecuted instantiation: node_dump.c:ccan_list_node_to_off_ Unexecuted instantiation: numeric.c:ccan_list_node_to_off_ Unexecuted instantiation: object.c:ccan_list_node_to_off_ Unexecuted instantiation: pack.c:ccan_list_node_to_off_ Unexecuted instantiation: proc.c:ccan_list_node_to_off_ Unexecuted instantiation: process.c:ccan_list_node_to_off_ ractor.c:ccan_list_node_to_off_ Line | Count | Source | 758 | 227k | { | 759 | 227k | return (void *)((char *)node - off); | 760 | 227k | } |
Unexecuted instantiation: random.c:ccan_list_node_to_off_ Unexecuted instantiation: rational.c:ccan_list_node_to_off_ Unexecuted instantiation: re.c:ccan_list_node_to_off_ Unexecuted instantiation: ruby.c:ccan_list_node_to_off_ Unexecuted instantiation: scheduler.c:ccan_list_node_to_off_ Unexecuted instantiation: set.c:ccan_list_node_to_off_ Unexecuted instantiation: shape.c:ccan_list_node_to_off_ Unexecuted instantiation: signal.c:ccan_list_node_to_off_ Unexecuted instantiation: st.c:ccan_list_node_to_off_ Unexecuted instantiation: string.c:ccan_list_node_to_off_ Unexecuted instantiation: struct.c:ccan_list_node_to_off_ Unexecuted instantiation: symbol.c:ccan_list_node_to_off_ thread.c:ccan_list_node_to_off_ Line | Count | Source | 758 | 45.5k | { | 759 | 45.5k | return (void *)((char *)node - off); | 760 | 45.5k | } |
Unexecuted instantiation: time.c:ccan_list_node_to_off_ Unexecuted instantiation: transcode.c:ccan_list_node_to_off_ Unexecuted instantiation: variable.c:ccan_list_node_to_off_ Unexecuted instantiation: version.c:ccan_list_node_to_off_ vm.c:ccan_list_node_to_off_ Line | Count | Source | 758 | 91.0k | { | 759 | 91.0k | return (void *)((char *)node - off); | 760 | 91.0k | } |
Unexecuted instantiation: vm_backtrace.c:ccan_list_node_to_off_ Unexecuted instantiation: vm_dump.c:ccan_list_node_to_off_ Unexecuted instantiation: vm_sync.c:ccan_list_node_to_off_ Unexecuted instantiation: vm_trace.c:ccan_list_node_to_off_ Unexecuted instantiation: weakmap.c:ccan_list_node_to_off_ Unexecuted instantiation: builtin.c:ccan_list_node_to_off_ Unexecuted instantiation: ast.c:ccan_list_node_to_off_ Unexecuted instantiation: box.c:ccan_list_node_to_off_ Unexecuted instantiation: compile.c:ccan_list_node_to_off_ Unexecuted instantiation: concurrent_set.c:ccan_list_node_to_off_ Unexecuted instantiation: cont.c:ccan_list_node_to_off_ Unexecuted instantiation: debug.c:ccan_list_node_to_off_ Unexecuted instantiation: dir.c:ccan_list_node_to_off_ Unexecuted instantiation: parse.c:ccan_list_node_to_off_ |
761 | | static inline struct ccan_list_node *ccan_list_node_from_off_(void *ptr, size_t off) |
762 | 1.65M | { |
763 | 1.65M | return (struct ccan_list_node *)((char *)ptr + off); |
764 | 1.65M | } Unexecuted instantiation: array.c:ccan_list_node_from_off_ Unexecuted instantiation: bignum.c:ccan_list_node_from_off_ Unexecuted instantiation: class.c:ccan_list_node_from_off_ Unexecuted instantiation: complex.c:ccan_list_node_from_off_ Unexecuted instantiation: enumerator.c:ccan_list_node_from_off_ Unexecuted instantiation: error.c:ccan_list_node_from_off_ Unexecuted instantiation: eval.c:ccan_list_node_from_off_ Unexecuted instantiation: file.c:ccan_list_node_from_off_ gc.c:ccan_list_node_from_off_ Line | Count | Source | 762 | 1.20M | { | 763 | 1.20M | return (struct ccan_list_node *)((char *)ptr + off); | 764 | 1.20M | } |
Unexecuted instantiation: hash.c:ccan_list_node_from_off_ Unexecuted instantiation: imemo.c:ccan_list_node_from_off_ Unexecuted instantiation: io.c:ccan_list_node_from_off_ Unexecuted instantiation: io_buffer.c:ccan_list_node_from_off_ Unexecuted instantiation: iseq.c:ccan_list_node_from_off_ Unexecuted instantiation: load.c:ccan_list_node_from_off_ Unexecuted instantiation: marshal.c:ccan_list_node_from_off_ Unexecuted instantiation: memory_view.c:ccan_list_node_from_off_ Unexecuted instantiation: node.c:ccan_list_node_from_off_ Unexecuted instantiation: node_dump.c:ccan_list_node_from_off_ Unexecuted instantiation: numeric.c:ccan_list_node_from_off_ Unexecuted instantiation: object.c:ccan_list_node_from_off_ Unexecuted instantiation: pack.c:ccan_list_node_from_off_ Unexecuted instantiation: proc.c:ccan_list_node_from_off_ Unexecuted instantiation: process.c:ccan_list_node_from_off_ ractor.c:ccan_list_node_from_off_ Line | Count | Source | 762 | 273k | { | 763 | 273k | return (struct ccan_list_node *)((char *)ptr + off); | 764 | 273k | } |
Unexecuted instantiation: random.c:ccan_list_node_from_off_ Unexecuted instantiation: rational.c:ccan_list_node_from_off_ Unexecuted instantiation: re.c:ccan_list_node_from_off_ Unexecuted instantiation: ruby.c:ccan_list_node_from_off_ Unexecuted instantiation: scheduler.c:ccan_list_node_from_off_ Unexecuted instantiation: set.c:ccan_list_node_from_off_ Unexecuted instantiation: shape.c:ccan_list_node_from_off_ Unexecuted instantiation: signal.c:ccan_list_node_from_off_ Unexecuted instantiation: st.c:ccan_list_node_from_off_ Unexecuted instantiation: string.c:ccan_list_node_from_off_ Unexecuted instantiation: struct.c:ccan_list_node_from_off_ Unexecuted instantiation: symbol.c:ccan_list_node_from_off_ thread.c:ccan_list_node_from_off_ Line | Count | Source | 762 | 45.5k | { | 763 | 45.5k | return (struct ccan_list_node *)((char *)ptr + off); | 764 | 45.5k | } |
Unexecuted instantiation: time.c:ccan_list_node_from_off_ Unexecuted instantiation: transcode.c:ccan_list_node_from_off_ Unexecuted instantiation: variable.c:ccan_list_node_from_off_ Unexecuted instantiation: version.c:ccan_list_node_from_off_ vm.c:ccan_list_node_from_off_ Line | Count | Source | 762 | 136k | { | 763 | 136k | return (struct ccan_list_node *)((char *)ptr + off); | 764 | 136k | } |
Unexecuted instantiation: vm_backtrace.c:ccan_list_node_from_off_ Unexecuted instantiation: vm_dump.c:ccan_list_node_from_off_ Unexecuted instantiation: vm_sync.c:ccan_list_node_from_off_ Unexecuted instantiation: vm_trace.c:ccan_list_node_from_off_ Unexecuted instantiation: weakmap.c:ccan_list_node_from_off_ Unexecuted instantiation: builtin.c:ccan_list_node_from_off_ Unexecuted instantiation: ast.c:ccan_list_node_from_off_ Unexecuted instantiation: box.c:ccan_list_node_from_off_ Unexecuted instantiation: compile.c:ccan_list_node_from_off_ Unexecuted instantiation: concurrent_set.c:ccan_list_node_from_off_ Unexecuted instantiation: cont.c:ccan_list_node_from_off_ Unexecuted instantiation: debug.c:ccan_list_node_from_off_ Unexecuted instantiation: dir.c:ccan_list_node_from_off_ Unexecuted instantiation: parse.c:ccan_list_node_from_off_ |
765 | | |
766 | | /* Get the offset of the member, but make sure it's a ccan_list_node. */ |
767 | | #define ccan_list_off_(type, member) \ |
768 | 227k | (ccan_container_off(type, member) + \ |
769 | 227k | ccan_check_type(((type *)0)->member, struct ccan_list_node)) |
770 | | |
771 | | #define ccan_list_off_var_(var, member) \ |
772 | 486k | (ccan_container_off_var(var, member) + \ |
773 | 486k | ccan_check_type(var->member, struct ccan_list_node)) |
774 | | |
775 | | #if defined(HAVE_TYPEOF) && HAVE_TYPEOF |
776 | | #define ccan_list_typeof(var) typeof(var) |
777 | | #else |
778 | | #define ccan_list_typeof(var) void * |
779 | | #endif |
780 | | |
781 | | /* Returns member, or NULL if at end of list. */ |
782 | | static inline void *ccan_list_entry_or_null(const struct ccan_list_head *h, |
783 | | const struct ccan_list_node *n, |
784 | | size_t off) |
785 | 486k | { |
786 | 486k | if (n == &h->n) |
787 | 177k | return NULL; |
788 | 309k | return (char *)n - off; |
789 | 486k | } Unexecuted instantiation: array.c:ccan_list_entry_or_null Unexecuted instantiation: bignum.c:ccan_list_entry_or_null Unexecuted instantiation: class.c:ccan_list_entry_or_null Unexecuted instantiation: complex.c:ccan_list_entry_or_null Unexecuted instantiation: enumerator.c:ccan_list_entry_or_null Unexecuted instantiation: error.c:ccan_list_entry_or_null Unexecuted instantiation: eval.c:ccan_list_entry_or_null Unexecuted instantiation: file.c:ccan_list_entry_or_null gc.c:ccan_list_entry_or_null Line | Count | Source | 785 | 486k | { | 786 | 486k | if (n == &h->n) | 787 | 177k | return NULL; | 788 | 309k | return (char *)n - off; | 789 | 486k | } |
Unexecuted instantiation: hash.c:ccan_list_entry_or_null Unexecuted instantiation: imemo.c:ccan_list_entry_or_null Unexecuted instantiation: io.c:ccan_list_entry_or_null Unexecuted instantiation: io_buffer.c:ccan_list_entry_or_null Unexecuted instantiation: iseq.c:ccan_list_entry_or_null Unexecuted instantiation: load.c:ccan_list_entry_or_null Unexecuted instantiation: marshal.c:ccan_list_entry_or_null Unexecuted instantiation: memory_view.c:ccan_list_entry_or_null Unexecuted instantiation: node.c:ccan_list_entry_or_null Unexecuted instantiation: node_dump.c:ccan_list_entry_or_null Unexecuted instantiation: numeric.c:ccan_list_entry_or_null Unexecuted instantiation: object.c:ccan_list_entry_or_null Unexecuted instantiation: pack.c:ccan_list_entry_or_null Unexecuted instantiation: proc.c:ccan_list_entry_or_null Unexecuted instantiation: process.c:ccan_list_entry_or_null Unexecuted instantiation: ractor.c:ccan_list_entry_or_null Unexecuted instantiation: random.c:ccan_list_entry_or_null Unexecuted instantiation: rational.c:ccan_list_entry_or_null Unexecuted instantiation: re.c:ccan_list_entry_or_null Unexecuted instantiation: ruby.c:ccan_list_entry_or_null Unexecuted instantiation: scheduler.c:ccan_list_entry_or_null Unexecuted instantiation: set.c:ccan_list_entry_or_null Unexecuted instantiation: shape.c:ccan_list_entry_or_null Unexecuted instantiation: signal.c:ccan_list_entry_or_null Unexecuted instantiation: st.c:ccan_list_entry_or_null Unexecuted instantiation: string.c:ccan_list_entry_or_null Unexecuted instantiation: struct.c:ccan_list_entry_or_null Unexecuted instantiation: symbol.c:ccan_list_entry_or_null Unexecuted instantiation: thread.c:ccan_list_entry_or_null Unexecuted instantiation: time.c:ccan_list_entry_or_null Unexecuted instantiation: transcode.c:ccan_list_entry_or_null Unexecuted instantiation: variable.c:ccan_list_entry_or_null Unexecuted instantiation: version.c:ccan_list_entry_or_null Unexecuted instantiation: vm.c:ccan_list_entry_or_null Unexecuted instantiation: vm_backtrace.c:ccan_list_entry_or_null Unexecuted instantiation: vm_dump.c:ccan_list_entry_or_null Unexecuted instantiation: vm_sync.c:ccan_list_entry_or_null Unexecuted instantiation: vm_trace.c:ccan_list_entry_or_null Unexecuted instantiation: weakmap.c:ccan_list_entry_or_null Unexecuted instantiation: builtin.c:ccan_list_entry_or_null Unexecuted instantiation: ast.c:ccan_list_entry_or_null Unexecuted instantiation: box.c:ccan_list_entry_or_null Unexecuted instantiation: compile.c:ccan_list_entry_or_null Unexecuted instantiation: concurrent_set.c:ccan_list_entry_or_null Unexecuted instantiation: cont.c:ccan_list_entry_or_null Unexecuted instantiation: debug.c:ccan_list_entry_or_null Unexecuted instantiation: dir.c:ccan_list_entry_or_null Unexecuted instantiation: parse.c:ccan_list_entry_or_null |
790 | | |
791 | | #endif /* CCAN_LIST_H */ |