diff options
Diffstat (limited to 'tools/testing/selftests/kvm/lib/sparsebit.c')
-rw-r--r-- | tools/testing/selftests/kvm/lib/sparsebit.c | 2087 |
1 files changed, 2087 insertions, 0 deletions
diff --git a/tools/testing/selftests/kvm/lib/sparsebit.c b/tools/testing/selftests/kvm/lib/sparsebit.c new file mode 100644 index 000000000000..0c5cf3e0cb6f --- /dev/null +++ b/tools/testing/selftests/kvm/lib/sparsebit.c | |||
@@ -0,0 +1,2087 @@ | |||
1 | /* | ||
2 | * Sparse bit array | ||
3 | * | ||
4 | * Copyright (C) 2018, Google LLC. | ||
5 | * Copyright (C) 2018, Red Hat, Inc. (code style cleanup and fuzzing driver) | ||
6 | * | ||
7 | * This work is licensed under the terms of the GNU GPL, version 2. | ||
8 | * | ||
9 | * This library provides functions to support a memory efficient bit array, | ||
10 | * with an index size of 2^64. A sparsebit array is allocated through | ||
11 | * the use sparsebit_alloc() and free'd via sparsebit_free(), | ||
12 | * such as in the following: | ||
13 | * | ||
14 | * struct sparsebit *s; | ||
15 | * s = sparsebit_alloc(); | ||
16 | * sparsebit_free(&s); | ||
17 | * | ||
18 | * The struct sparsebit type resolves down to a struct sparsebit. | ||
19 | * Note that, sparsebit_free() takes a pointer to the sparsebit | ||
20 | * structure. This is so that sparsebit_free() is able to poison | ||
21 | * the pointer (e.g. set it to NULL) to the struct sparsebit before | ||
22 | * returning to the caller. | ||
23 | * | ||
24 | * Between the return of sparsebit_alloc() and the call of | ||
25 | * sparsebit_free(), there are multiple query and modifying operations | ||
26 | * that can be performed on the allocated sparsebit array. All of | ||
27 | * these operations take as a parameter the value returned from | ||
28 | * sparsebit_alloc() and most also take a bit index. Frequently | ||
29 | * used routines include: | ||
30 | * | ||
31 | * ---- Query Operations | ||
32 | * sparsebit_is_set(s, idx) | ||
33 | * sparsebit_is_clear(s, idx) | ||
34 | * sparsebit_any_set(s) | ||
35 | * sparsebit_first_set(s) | ||
36 | * sparsebit_next_set(s, prev_idx) | ||
37 | * | ||
38 | * ---- Modifying Operations | ||
39 | * sparsebit_set(s, idx) | ||
40 | * sparsebit_clear(s, idx) | ||
41 | * sparsebit_set_num(s, idx, num); | ||
42 | * sparsebit_clear_num(s, idx, num); | ||
43 | * | ||
44 | * A common operation, is to itterate over all the bits set in a test | ||
45 | * sparsebit array. This can be done via code with the following structure: | ||
46 | * | ||
47 | * sparsebit_idx_t idx; | ||
48 | * if (sparsebit_any_set(s)) { | ||
49 | * idx = sparsebit_first_set(s); | ||
50 | * do { | ||
51 | * ... | ||
52 | * idx = sparsebit_next_set(s, idx); | ||
53 | * } while (idx != 0); | ||
54 | * } | ||
55 | * | ||
56 | * The index of the first bit set needs to be obtained via | ||
57 | * sparsebit_first_set(), because sparsebit_next_set(), needs | ||
58 | * the index of the previously set. The sparsebit_idx_t type is | ||
59 | * unsigned, so there is no previous index before 0 that is available. | ||
60 | * Also, the call to sparsebit_first_set() is not made unless there | ||
61 | * is at least 1 bit in the array set. This is because sparsebit_first_set() | ||
62 | * aborts if sparsebit_first_set() is called with no bits set. | ||
63 | * It is the callers responsibility to assure that the | ||
64 | * sparsebit array has at least a single bit set before calling | ||
65 | * sparsebit_first_set(). | ||
66 | * | ||
67 | * ==== Implementation Overview ==== | ||
68 | * For the most part the internal implementation of sparsebit is | ||
69 | * opaque to the caller. One important implementation detail that the | ||
70 | * caller may need to be aware of is the spatial complexity of the | ||
71 | * implementation. This implementation of a sparsebit array is not | ||
72 | * only sparse, in that it uses memory proportional to the number of bits | ||
73 | * set. It is also efficient in memory usage when most of the bits are | ||
74 | * set. | ||
75 | * | ||
76 | * At a high-level the state of the bit settings are maintained through | ||
77 | * the use of a binary-search tree, where each node contains at least | ||
78 | * the following members: | ||
79 | * | ||
80 | * typedef uint64_t sparsebit_idx_t; | ||
81 | * typedef uint64_t sparsebit_num_t; | ||
82 | * | ||
83 | * sparsebit_idx_t idx; | ||
84 | * uint32_t mask; | ||
85 | * sparsebit_num_t num_after; | ||
86 | * | ||
87 | * The idx member contains the bit index of the first bit described by this | ||
88 | * node, while the mask member stores the setting of the first 32-bits. | ||
89 | * The setting of the bit at idx + n, where 0 <= n < 32, is located in the | ||
90 | * mask member at 1 << n. | ||
91 | * | ||
92 | * Nodes are sorted by idx and the bits described by two nodes will never | ||
93 | * overlap. The idx member is always aligned to the mask size, i.e. a | ||
94 | * multiple of 32. | ||
95 | * | ||
96 | * Beyond a typical implementation, the nodes in this implementation also | ||
97 | * contains a member named num_after. The num_after member holds the | ||
98 | * number of bits immediately after the mask bits that are contiguously set. | ||
99 | * The use of the num_after member allows this implementation to efficiently | ||
100 | * represent cases where most bits are set. For example, the case of all | ||
101 | * but the last two bits set, is represented by the following two nodes: | ||
102 | * | ||
103 | * node 0 - idx: 0x0 mask: 0xffffffff num_after: 0xffffffffffffffc0 | ||
104 | * node 1 - idx: 0xffffffffffffffe0 mask: 0x3fffffff num_after: 0 | ||
105 | * | ||
106 | * ==== Invariants ==== | ||
107 | * This implementation usses the following invariants: | ||
108 | * | ||
109 | * + Node are only used to represent bits that are set. | ||
110 | * Nodes with a mask of 0 and num_after of 0 are not allowed. | ||
111 | * | ||
112 | * + Sum of bits set in all the nodes is equal to the value of | ||
113 | * the struct sparsebit_pvt num_set member. | ||
114 | * | ||
115 | * + The setting of at least one bit is always described in a nodes | ||
116 | * mask (mask >= 1). | ||
117 | * | ||
118 | * + A node with all mask bits set only occurs when the last bit | ||
119 | * described by the previous node is not equal to this nodes | ||
120 | * starting index - 1. All such occurences of this condition are | ||
121 | * avoided by moving the setting of the nodes mask bits into | ||
122 | * the previous nodes num_after setting. | ||
123 | * | ||
124 | * + Node starting index is evenly divisable by the number of bits | ||
125 | * within a nodes mask member. | ||
126 | * | ||
127 | * + Nodes never represent a range of bits that wrap around the | ||
128 | * highest supported index. | ||
129 | * | ||
130 | * (idx + MASK_BITS + num_after - 1) <= ((sparsebit_idx_t) 0) - 1) | ||
131 | * | ||
132 | * As a consequence of the above, the num_after member of a node | ||
133 | * will always be <=: | ||
134 | * | ||
135 | * maximum_index - nodes_starting_index - number_of_mask_bits | ||
136 | * | ||
137 | * + Nodes within the binary search tree are sorted based on each | ||
138 | * nodes starting index. | ||
139 | * | ||
140 | * + The range of bits described by any two nodes do not overlap. The | ||
141 | * range of bits described by a single node is: | ||
142 | * | ||
143 | * start: node->idx | ||
144 | * end (inclusive): node->idx + MASK_BITS + node->num_after - 1; | ||
145 | * | ||
146 | * Note, at times these invariants are temporarily violated for a | ||
147 | * specific portion of the code. For example, when setting a mask | ||
148 | * bit, there is a small delay between when the mask bit is set and the | ||
149 | * value in the struct sparsebit_pvt num_set member is updated. Other | ||
150 | * temporary violations occur when node_split() is called with a specified | ||
151 | * index and assures that a node where its mask represents the bit | ||
152 | * at the specified index exists. At times to do this node_split() | ||
153 | * must split an existing node into two nodes or create a node that | ||
154 | * has no bits set. Such temporary violations must be corrected before | ||
155 | * returning to the caller. These corrections are typically performed | ||
156 | * by the local function node_reduce(). | ||
157 | */ | ||
158 | |||
159 | #include "test_util.h" | ||
160 | #include "sparsebit.h" | ||
161 | #include <limits.h> | ||
162 | #include <assert.h> | ||
163 | |||
164 | #define DUMP_LINE_MAX 100 /* Does not include indent amount */ | ||
165 | |||
166 | typedef uint32_t mask_t; | ||
167 | #define MASK_BITS (sizeof(mask_t) * CHAR_BIT) | ||
168 | |||
169 | struct node { | ||
170 | struct node *parent; | ||
171 | struct node *left; | ||
172 | struct node *right; | ||
173 | sparsebit_idx_t idx; /* index of least-significant bit in mask */ | ||
174 | sparsebit_num_t num_after; /* num contiguously set after mask */ | ||
175 | mask_t mask; | ||
176 | }; | ||
177 | |||
178 | struct sparsebit { | ||
179 | /* | ||
180 | * Points to root node of the binary search | ||
181 | * tree. Equal to NULL when no bits are set in | ||
182 | * the entire sparsebit array. | ||
183 | */ | ||
184 | struct node *root; | ||
185 | |||
186 | /* | ||
187 | * A redundant count of the total number of bits set. Used for | ||
188 | * diagnostic purposes and to change the time complexity of | ||
189 | * sparsebit_num_set() from O(n) to O(1). | ||
190 | * Note: Due to overflow, a value of 0 means none or all set. | ||
191 | */ | ||
192 | sparsebit_num_t num_set; | ||
193 | }; | ||
194 | |||
195 | /* Returns the number of set bits described by the settings | ||
196 | * of the node pointed to by nodep. | ||
197 | */ | ||
198 | static sparsebit_num_t node_num_set(struct node *nodep) | ||
199 | { | ||
200 | return nodep->num_after + __builtin_popcount(nodep->mask); | ||
201 | } | ||
202 | |||
203 | /* Returns a pointer to the node that describes the | ||
204 | * lowest bit index. | ||
205 | */ | ||
206 | static struct node *node_first(struct sparsebit *s) | ||
207 | { | ||
208 | struct node *nodep; | ||
209 | |||
210 | for (nodep = s->root; nodep && nodep->left; nodep = nodep->left) | ||
211 | ; | ||
212 | |||
213 | return nodep; | ||
214 | } | ||
215 | |||
216 | /* Returns a pointer to the node that describes the | ||
217 | * lowest bit index > the index of the node pointed to by np. | ||
218 | * Returns NULL if no node with a higher index exists. | ||
219 | */ | ||
220 | static struct node *node_next(struct sparsebit *s, struct node *np) | ||
221 | { | ||
222 | struct node *nodep = np; | ||
223 | |||
224 | /* | ||
225 | * If current node has a right child, next node is the left-most | ||
226 | * of the right child. | ||
227 | */ | ||
228 | if (nodep->right) { | ||
229 | for (nodep = nodep->right; nodep->left; nodep = nodep->left) | ||
230 | ; | ||
231 | return nodep; | ||
232 | } | ||
233 | |||
234 | /* | ||
235 | * No right child. Go up until node is left child of a parent. | ||
236 | * That parent is then the next node. | ||
237 | */ | ||
238 | while (nodep->parent && nodep == nodep->parent->right) | ||
239 | nodep = nodep->parent; | ||
240 | |||
241 | return nodep->parent; | ||
242 | } | ||
243 | |||
244 | /* Searches for and returns a pointer to the node that describes the | ||
245 | * highest index < the index of the node pointed to by np. | ||
246 | * Returns NULL if no node with a lower index exists. | ||
247 | */ | ||
248 | static struct node *node_prev(struct sparsebit *s, struct node *np) | ||
249 | { | ||
250 | struct node *nodep = np; | ||
251 | |||
252 | /* | ||
253 | * If current node has a left child, next node is the right-most | ||
254 | * of the left child. | ||
255 | */ | ||
256 | if (nodep->left) { | ||
257 | for (nodep = nodep->left; nodep->right; nodep = nodep->right) | ||
258 | ; | ||
259 | return (struct node *) nodep; | ||
260 | } | ||
261 | |||
262 | /* | ||
263 | * No left child. Go up until node is right child of a parent. | ||
264 | * That parent is then the next node. | ||
265 | */ | ||
266 | while (nodep->parent && nodep == nodep->parent->left) | ||
267 | nodep = nodep->parent; | ||
268 | |||
269 | return (struct node *) nodep->parent; | ||
270 | } | ||
271 | |||
272 | |||
273 | /* Allocates space to hold a copy of the node sub-tree pointed to by | ||
274 | * subtree and duplicates the bit settings to the newly allocated nodes. | ||
275 | * Returns the newly allocated copy of subtree. | ||
276 | */ | ||
277 | static struct node *node_copy_subtree(struct node *subtree) | ||
278 | { | ||
279 | struct node *root; | ||
280 | |||
281 | /* Duplicate the node at the root of the subtree */ | ||
282 | root = calloc(1, sizeof(*root)); | ||
283 | if (!root) { | ||
284 | perror("calloc"); | ||
285 | abort(); | ||
286 | } | ||
287 | |||
288 | root->idx = subtree->idx; | ||
289 | root->mask = subtree->mask; | ||
290 | root->num_after = subtree->num_after; | ||
291 | |||
292 | /* As needed, recursively duplicate the left and right subtrees */ | ||
293 | if (subtree->left) { | ||
294 | root->left = node_copy_subtree(subtree->left); | ||
295 | root->left->parent = root; | ||
296 | } | ||
297 | |||
298 | if (subtree->right) { | ||
299 | root->right = node_copy_subtree(subtree->right); | ||
300 | root->right->parent = root; | ||
301 | } | ||
302 | |||
303 | return root; | ||
304 | } | ||
305 | |||
306 | /* Searches for and returns a pointer to the node that describes the setting | ||
307 | * of the bit given by idx. A node describes the setting of a bit if its | ||
308 | * index is within the bits described by the mask bits or the number of | ||
309 | * contiguous bits set after the mask. Returns NULL if there is no such node. | ||
310 | */ | ||
311 | static struct node *node_find(struct sparsebit *s, sparsebit_idx_t idx) | ||
312 | { | ||
313 | struct node *nodep; | ||
314 | |||
315 | /* Find the node that describes the setting of the bit at idx */ | ||
316 | for (nodep = s->root; nodep; | ||
317 | nodep = nodep->idx > idx ? nodep->left : nodep->right) { | ||
318 | if (idx >= nodep->idx && | ||
319 | idx <= nodep->idx + MASK_BITS + nodep->num_after - 1) | ||
320 | break; | ||
321 | } | ||
322 | |||
323 | return nodep; | ||
324 | } | ||
325 | |||
326 | /* Entry Requirements: | ||
327 | * + A node that describes the setting of idx is not already present. | ||
328 | * | ||
329 | * Adds a new node to describe the setting of the bit at the index given | ||
330 | * by idx. Returns a pointer to the newly added node. | ||
331 | * | ||
332 | * TODO(lhuemill): Degenerate cases causes the tree to get unbalanced. | ||
333 | */ | ||
334 | static struct node *node_add(struct sparsebit *s, sparsebit_idx_t idx) | ||
335 | { | ||
336 | struct node *nodep, *parentp, *prev; | ||
337 | |||
338 | /* Allocate and initialize the new node. */ | ||
339 | nodep = calloc(1, sizeof(*nodep)); | ||
340 | if (!nodep) { | ||
341 | perror("calloc"); | ||
342 | abort(); | ||
343 | } | ||
344 | |||
345 | nodep->idx = idx & -MASK_BITS; | ||
346 | |||
347 | /* If no nodes, set it up as the root node. */ | ||
348 | if (!s->root) { | ||
349 | s->root = nodep; | ||
350 | return nodep; | ||
351 | } | ||
352 | |||
353 | /* | ||
354 | * Find the parent where the new node should be attached | ||
355 | * and add the node there. | ||
356 | */ | ||
357 | parentp = s->root; | ||
358 | while (true) { | ||
359 | if (idx < parentp->idx) { | ||
360 | if (!parentp->left) { | ||
361 | parentp->left = nodep; | ||
362 | nodep->parent = parentp; | ||
363 | break; | ||
364 | } | ||
365 | parentp = parentp->left; | ||
366 | } else { | ||
367 | assert(idx > parentp->idx + MASK_BITS + parentp->num_after - 1); | ||
368 | if (!parentp->right) { | ||
369 | parentp->right = nodep; | ||
370 | nodep->parent = parentp; | ||
371 | break; | ||
372 | } | ||
373 | parentp = parentp->right; | ||
374 | } | ||
375 | } | ||
376 | |||
377 | /* | ||
378 | * Does num_after bits of previous node overlap with the mask | ||
379 | * of the new node? If so set the bits in the new nodes mask | ||
380 | * and reduce the previous nodes num_after. | ||
381 | */ | ||
382 | prev = node_prev(s, nodep); | ||
383 | while (prev && prev->idx + MASK_BITS + prev->num_after - 1 >= nodep->idx) { | ||
384 | unsigned int n1 = (prev->idx + MASK_BITS + prev->num_after - 1) | ||
385 | - nodep->idx; | ||
386 | assert(prev->num_after > 0); | ||
387 | assert(n1 < MASK_BITS); | ||
388 | assert(!(nodep->mask & (1 << n1))); | ||
389 | nodep->mask |= (1 << n1); | ||
390 | prev->num_after--; | ||
391 | } | ||
392 | |||
393 | return nodep; | ||
394 | } | ||
395 | |||
396 | /* Returns whether all the bits in the sparsebit array are set. */ | ||
397 | bool sparsebit_all_set(struct sparsebit *s) | ||
398 | { | ||
399 | /* | ||
400 | * If any nodes there must be at least one bit set. Only case | ||
401 | * where a bit is set and total num set is 0, is when all bits | ||
402 | * are set. | ||
403 | */ | ||
404 | return s->root && s->num_set == 0; | ||
405 | } | ||
406 | |||
407 | /* Clears all bits described by the node pointed to by nodep, then | ||
408 | * removes the node. | ||
409 | */ | ||
410 | static void node_rm(struct sparsebit *s, struct node *nodep) | ||
411 | { | ||
412 | struct node *tmp; | ||
413 | sparsebit_num_t num_set; | ||
414 | |||
415 | num_set = node_num_set(nodep); | ||
416 | assert(s->num_set >= num_set || sparsebit_all_set(s)); | ||
417 | s->num_set -= node_num_set(nodep); | ||
418 | |||
419 | /* Have both left and right child */ | ||
420 | if (nodep->left && nodep->right) { | ||
421 | /* | ||
422 | * Move left children to the leftmost leaf node | ||
423 | * of the right child. | ||
424 | */ | ||
425 | for (tmp = nodep->right; tmp->left; tmp = tmp->left) | ||
426 | ; | ||
427 | tmp->left = nodep->left; | ||
428 | nodep->left = NULL; | ||
429 | tmp->left->parent = tmp; | ||
430 | } | ||
431 | |||
432 | /* Left only child */ | ||
433 | if (nodep->left) { | ||
434 | if (!nodep->parent) { | ||
435 | s->root = nodep->left; | ||
436 | nodep->left->parent = NULL; | ||
437 | } else { | ||
438 | nodep->left->parent = nodep->parent; | ||
439 | if (nodep == nodep->parent->left) | ||
440 | nodep->parent->left = nodep->left; | ||
441 | else { | ||
442 | assert(nodep == nodep->parent->right); | ||
443 | nodep->parent->right = nodep->left; | ||
444 | } | ||
445 | } | ||
446 | |||
447 | nodep->parent = nodep->left = nodep->right = NULL; | ||
448 | free(nodep); | ||
449 | |||
450 | return; | ||
451 | } | ||
452 | |||
453 | |||
454 | /* Right only child */ | ||
455 | if (nodep->right) { | ||
456 | if (!nodep->parent) { | ||
457 | s->root = nodep->right; | ||
458 | nodep->right->parent = NULL; | ||
459 | } else { | ||
460 | nodep->right->parent = nodep->parent; | ||
461 | if (nodep == nodep->parent->left) | ||
462 | nodep->parent->left = nodep->right; | ||
463 | else { | ||
464 | assert(nodep == nodep->parent->right); | ||
465 | nodep->parent->right = nodep->right; | ||
466 | } | ||
467 | } | ||
468 | |||
469 | nodep->parent = nodep->left = nodep->right = NULL; | ||
470 | free(nodep); | ||
471 | |||
472 | return; | ||
473 | } | ||
474 | |||
475 | /* Leaf Node */ | ||
476 | if (!nodep->parent) { | ||
477 | s->root = NULL; | ||
478 | } else { | ||
479 | if (nodep->parent->left == nodep) | ||
480 | nodep->parent->left = NULL; | ||
481 | else { | ||
482 | assert(nodep == nodep->parent->right); | ||
483 | nodep->parent->right = NULL; | ||
484 | } | ||
485 | } | ||
486 | |||
487 | nodep->parent = nodep->left = nodep->right = NULL; | ||
488 | free(nodep); | ||
489 | |||
490 | return; | ||
491 | } | ||
492 | |||
493 | /* Splits the node containing the bit at idx so that there is a node | ||
494 | * that starts at the specified index. If no such node exists, a new | ||
495 | * node at the specified index is created. Returns the new node. | ||
496 | * | ||
497 | * idx must start of a mask boundary. | ||
498 | */ | ||
499 | static struct node *node_split(struct sparsebit *s, sparsebit_idx_t idx) | ||
500 | { | ||
501 | struct node *nodep1, *nodep2; | ||
502 | sparsebit_idx_t offset; | ||
503 | sparsebit_num_t orig_num_after; | ||
504 | |||
505 | assert(!(idx % MASK_BITS)); | ||
506 | |||
507 | /* | ||
508 | * Is there a node that describes the setting of idx? | ||
509 | * If not, add it. | ||
510 | */ | ||
511 | nodep1 = node_find(s, idx); | ||
512 | if (!nodep1) | ||
513 | return node_add(s, idx); | ||
514 | |||
515 | /* | ||
516 | * All done if the starting index of the node is where the | ||
517 | * split should occur. | ||
518 | */ | ||
519 | if (nodep1->idx == idx) | ||
520 | return nodep1; | ||
521 | |||
522 | /* | ||
523 | * Split point not at start of mask, so it must be part of | ||
524 | * bits described by num_after. | ||
525 | */ | ||
526 | |||
527 | /* | ||
528 | * Calculate offset within num_after for where the split is | ||
529 | * to occur. | ||
530 | */ | ||
531 | offset = idx - (nodep1->idx + MASK_BITS); | ||
532 | orig_num_after = nodep1->num_after; | ||
533 | |||
534 | /* | ||
535 | * Add a new node to describe the bits starting at | ||
536 | * the split point. | ||
537 | */ | ||
538 | nodep1->num_after = offset; | ||
539 | nodep2 = node_add(s, idx); | ||
540 | |||
541 | /* Move bits after the split point into the new node */ | ||
542 | nodep2->num_after = orig_num_after - offset; | ||
543 | if (nodep2->num_after >= MASK_BITS) { | ||
544 | nodep2->mask = ~(mask_t) 0; | ||
545 | nodep2->num_after -= MASK_BITS; | ||
546 | } else { | ||
547 | nodep2->mask = (1 << nodep2->num_after) - 1; | ||
548 | nodep2->num_after = 0; | ||
549 | } | ||
550 | |||
551 | return nodep2; | ||
552 | } | ||
553 | |||
554 | /* Iteratively reduces the node pointed to by nodep and its adjacent | ||
555 | * nodes into a more compact form. For example, a node with a mask with | ||
556 | * all bits set adjacent to a previous node, will get combined into a | ||
557 | * single node with an increased num_after setting. | ||
558 | * | ||
559 | * After each reduction, a further check is made to see if additional | ||
560 | * reductions are possible with the new previous and next nodes. Note, | ||
561 | * a search for a reduction is only done across the nodes nearest nodep | ||
562 | * and those that became part of a reduction. Reductions beyond nodep | ||
563 | * and the adjacent nodes that are reduced are not discovered. It is the | ||
564 | * responsibility of the caller to pass a nodep that is within one node | ||
565 | * of each possible reduction. | ||
566 | * | ||
567 | * This function does not fix the temporary violation of all invariants. | ||
568 | * For example it does not fix the case where the bit settings described | ||
569 | * by two or more nodes overlap. Such a violation introduces the potential | ||
570 | * complication of a bit setting for a specific index having different settings | ||
571 | * in different nodes. This would then introduce the further complication | ||
572 | * of which node has the correct setting of the bit and thus such conditions | ||
573 | * are not allowed. | ||
574 | * | ||
575 | * This function is designed to fix invariant violations that are introduced | ||
576 | * by node_split() and by changes to the nodes mask or num_after members. | ||
577 | * For example, when setting a bit within a nodes mask, the function that | ||
578 | * sets the bit doesn't have to worry about whether the setting of that | ||
579 | * bit caused the mask to have leading only or trailing only bits set. | ||
580 | * Instead, the function can call node_reduce(), with nodep equal to the | ||
581 | * node address that it set a mask bit in, and node_reduce() will notice | ||
582 | * the cases of leading or trailing only bits and that there is an | ||
583 | * adjacent node that the bit settings could be merged into. | ||
584 | * | ||
585 | * This implementation specifically detects and corrects violation of the | ||
586 | * following invariants: | ||
587 | * | ||
588 | * + Node are only used to represent bits that are set. | ||
589 | * Nodes with a mask of 0 and num_after of 0 are not allowed. | ||
590 | * | ||
591 | * + The setting of at least one bit is always described in a nodes | ||
592 | * mask (mask >= 1). | ||
593 | * | ||
594 | * + A node with all mask bits set only occurs when the last bit | ||
595 | * described by the previous node is not equal to this nodes | ||
596 | * starting index - 1. All such occurences of this condition are | ||
597 | * avoided by moving the setting of the nodes mask bits into | ||
598 | * the previous nodes num_after setting. | ||
599 | */ | ||
600 | static void node_reduce(struct sparsebit *s, struct node *nodep) | ||
601 | { | ||
602 | bool reduction_performed; | ||
603 | |||
604 | do { | ||
605 | reduction_performed = false; | ||
606 | struct node *prev, *next, *tmp; | ||
607 | |||
608 | /* 1) Potential reductions within the current node. */ | ||
609 | |||
610 | /* Nodes with all bits cleared may be removed. */ | ||
611 | if (nodep->mask == 0 && nodep->num_after == 0) { | ||
612 | /* | ||
613 | * About to remove the node pointed to by | ||
614 | * nodep, which normally would cause a problem | ||
615 | * for the next pass through the reduction loop, | ||
616 | * because the node at the starting point no longer | ||
617 | * exists. This potential problem is handled | ||
618 | * by first remembering the location of the next | ||
619 | * or previous nodes. Doesn't matter which, because | ||
620 | * once the node at nodep is removed, there will be | ||
621 | * no other nodes between prev and next. | ||
622 | * | ||
623 | * Note, the checks performed on nodep against both | ||
624 | * both prev and next both check for an adjacent | ||
625 | * node that can be reduced into a single node. As | ||
626 | * such, after removing the node at nodep, doesn't | ||
627 | * matter whether the nodep for the next pass | ||
628 | * through the loop is equal to the previous pass | ||
629 | * prev or next node. Either way, on the next pass | ||
630 | * the one not selected will become either the | ||
631 | * prev or next node. | ||
632 | */ | ||
633 | tmp = node_next(s, nodep); | ||
634 | if (!tmp) | ||
635 | tmp = node_prev(s, nodep); | ||
636 | |||
637 | node_rm(s, nodep); | ||
638 | nodep = NULL; | ||
639 | |||
640 | nodep = tmp; | ||
641 | reduction_performed = true; | ||
642 | continue; | ||
643 | } | ||
644 | |||
645 | /* | ||
646 | * When the mask is 0, can reduce the amount of num_after | ||
647 | * bits by moving the initial num_after bits into the mask. | ||
648 | */ | ||
649 | if (nodep->mask == 0) { | ||
650 | assert(nodep->num_after != 0); | ||
651 | assert(nodep->idx + MASK_BITS > nodep->idx); | ||
652 | |||
653 | nodep->idx += MASK_BITS; | ||
654 | |||
655 | if (nodep->num_after >= MASK_BITS) { | ||
656 | nodep->mask = ~0; | ||
657 | nodep->num_after -= MASK_BITS; | ||
658 | } else { | ||
659 | nodep->mask = (1u << nodep->num_after) - 1; | ||
660 | nodep->num_after = 0; | ||
661 | } | ||
662 | |||
663 | reduction_performed = true; | ||
664 | continue; | ||
665 | } | ||
666 | |||
667 | /* | ||
668 | * 2) Potential reductions between the current and | ||
669 | * previous nodes. | ||
670 | */ | ||
671 | prev = node_prev(s, nodep); | ||
672 | if (prev) { | ||
673 | sparsebit_idx_t prev_highest_bit; | ||
674 | |||
675 | /* Nodes with no bits set can be removed. */ | ||
676 | if (prev->mask == 0 && prev->num_after == 0) { | ||
677 | node_rm(s, prev); | ||
678 | |||
679 | reduction_performed = true; | ||
680 | continue; | ||
681 | } | ||
682 | |||
683 | /* | ||
684 | * All mask bits set and previous node has | ||
685 | * adjacent index. | ||
686 | */ | ||
687 | if (nodep->mask + 1 == 0 && | ||
688 | prev->idx + MASK_BITS == nodep->idx) { | ||
689 | prev->num_after += MASK_BITS + nodep->num_after; | ||
690 | nodep->mask = 0; | ||
691 | nodep->num_after = 0; | ||
692 | |||
693 | reduction_performed = true; | ||
694 | continue; | ||
695 | } | ||
696 | |||
697 | /* | ||
698 | * Is node adjacent to previous node and the node | ||
699 | * contains a single contiguous range of bits | ||
700 | * starting from the beginning of the mask? | ||
701 | */ | ||
702 | prev_highest_bit = prev->idx + MASK_BITS - 1 + prev->num_after; | ||
703 | if (prev_highest_bit + 1 == nodep->idx && | ||
704 | (nodep->mask | (nodep->mask >> 1)) == nodep->mask) { | ||
705 | /* | ||
706 | * How many contiguous bits are there? | ||
707 | * Is equal to the total number of set | ||
708 | * bits, due to an earlier check that | ||
709 | * there is a single contiguous range of | ||
710 | * set bits. | ||
711 | */ | ||
712 | unsigned int num_contiguous | ||
713 | = __builtin_popcount(nodep->mask); | ||
714 | assert((num_contiguous > 0) && | ||
715 | ((1ULL << num_contiguous) - 1) == nodep->mask); | ||
716 | |||
717 | prev->num_after += num_contiguous; | ||
718 | nodep->mask = 0; | ||
719 | |||
720 | /* | ||
721 | * For predictable performance, handle special | ||
722 | * case where all mask bits are set and there | ||
723 | * is a non-zero num_after setting. This code | ||
724 | * is functionally correct without the following | ||
725 | * conditionalized statements, but without them | ||
726 | * the value of num_after is only reduced by | ||
727 | * the number of mask bits per pass. There are | ||
728 | * cases where num_after can be close to 2^64. | ||
729 | * Without this code it could take nearly | ||
730 | * (2^64) / 32 passes to perform the full | ||
731 | * reduction. | ||
732 | */ | ||
733 | if (num_contiguous == MASK_BITS) { | ||
734 | prev->num_after += nodep->num_after; | ||
735 | nodep->num_after = 0; | ||
736 | } | ||
737 | |||
738 | reduction_performed = true; | ||
739 | continue; | ||
740 | } | ||
741 | } | ||
742 | |||
743 | /* | ||
744 | * 3) Potential reductions between the current and | ||
745 | * next nodes. | ||
746 | */ | ||
747 | next = node_next(s, nodep); | ||
748 | if (next) { | ||
749 | /* Nodes with no bits set can be removed. */ | ||
750 | if (next->mask == 0 && next->num_after == 0) { | ||
751 | node_rm(s, next); | ||
752 | reduction_performed = true; | ||
753 | continue; | ||
754 | } | ||
755 | |||
756 | /* | ||
757 | * Is next node index adjacent to current node | ||
758 | * and has a mask with all bits set? | ||
759 | */ | ||
760 | if (next->idx == nodep->idx + MASK_BITS + nodep->num_after && | ||
761 | next->mask == ~(mask_t) 0) { | ||
762 | nodep->num_after += MASK_BITS; | ||
763 | next->mask = 0; | ||
764 | nodep->num_after += next->num_after; | ||
765 | next->num_after = 0; | ||
766 | |||
767 | node_rm(s, next); | ||
768 | next = NULL; | ||
769 | |||
770 | reduction_performed = true; | ||
771 | continue; | ||
772 | } | ||
773 | } | ||
774 | } while (nodep && reduction_performed); | ||
775 | } | ||
776 | |||
777 | /* Returns whether the bit at the index given by idx, within the | ||
778 | * sparsebit array is set or not. | ||
779 | */ | ||
780 | bool sparsebit_is_set(struct sparsebit *s, sparsebit_idx_t idx) | ||
781 | { | ||
782 | struct node *nodep; | ||
783 | |||
784 | /* Find the node that describes the setting of the bit at idx */ | ||
785 | for (nodep = s->root; nodep; | ||
786 | nodep = nodep->idx > idx ? nodep->left : nodep->right) | ||
787 | if (idx >= nodep->idx && | ||
788 | idx <= nodep->idx + MASK_BITS + nodep->num_after - 1) | ||
789 | goto have_node; | ||
790 | |||
791 | return false; | ||
792 | |||
793 | have_node: | ||
794 | /* Bit is set if it is any of the bits described by num_after */ | ||
795 | if (nodep->num_after && idx >= nodep->idx + MASK_BITS) | ||
796 | return true; | ||
797 | |||
798 | /* Is the corresponding mask bit set */ | ||
799 | assert(idx >= nodep->idx && idx - nodep->idx < MASK_BITS); | ||
800 | return !!(nodep->mask & (1 << (idx - nodep->idx))); | ||
801 | } | ||
802 | |||
803 | /* Within the sparsebit array pointed to by s, sets the bit | ||
804 | * at the index given by idx. | ||
805 | */ | ||
806 | static void bit_set(struct sparsebit *s, sparsebit_idx_t idx) | ||
807 | { | ||
808 | struct node *nodep; | ||
809 | |||
810 | /* Skip bits that are already set */ | ||
811 | if (sparsebit_is_set(s, idx)) | ||
812 | return; | ||
813 | |||
814 | /* | ||
815 | * Get a node where the bit at idx is described by the mask. | ||
816 | * The node_split will also create a node, if there isn't | ||
817 | * already a node that describes the setting of bit. | ||
818 | */ | ||
819 | nodep = node_split(s, idx & -MASK_BITS); | ||
820 | |||
821 | /* Set the bit within the nodes mask */ | ||
822 | assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1); | ||
823 | assert(!(nodep->mask & (1 << (idx - nodep->idx)))); | ||
824 | nodep->mask |= 1 << (idx - nodep->idx); | ||
825 | s->num_set++; | ||
826 | |||
827 | node_reduce(s, nodep); | ||
828 | } | ||
829 | |||
830 | /* Within the sparsebit array pointed to by s, clears the bit | ||
831 | * at the index given by idx. | ||
832 | */ | ||
833 | static void bit_clear(struct sparsebit *s, sparsebit_idx_t idx) | ||
834 | { | ||
835 | struct node *nodep; | ||
836 | |||
837 | /* Skip bits that are already cleared */ | ||
838 | if (!sparsebit_is_set(s, idx)) | ||
839 | return; | ||
840 | |||
841 | /* Is there a node that describes the setting of this bit? */ | ||
842 | nodep = node_find(s, idx); | ||
843 | if (!nodep) | ||
844 | return; | ||
845 | |||
846 | /* | ||
847 | * If a num_after bit, split the node, so that the bit is | ||
848 | * part of a node mask. | ||
849 | */ | ||
850 | if (idx >= nodep->idx + MASK_BITS) | ||
851 | nodep = node_split(s, idx & -MASK_BITS); | ||
852 | |||
853 | /* | ||
854 | * After node_split above, bit at idx should be within the mask. | ||
855 | * Clear that bit. | ||
856 | */ | ||
857 | assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1); | ||
858 | assert(nodep->mask & (1 << (idx - nodep->idx))); | ||
859 | nodep->mask &= ~(1 << (idx - nodep->idx)); | ||
860 | assert(s->num_set > 0 || sparsebit_all_set(s)); | ||
861 | s->num_set--; | ||
862 | |||
863 | node_reduce(s, nodep); | ||
864 | } | ||
865 | |||
866 | /* Recursively dumps to the FILE stream given by stream the contents | ||
867 | * of the sub-tree of nodes pointed to by nodep. Each line of output | ||
868 | * is prefixed by the number of spaces given by indent. On each | ||
869 | * recursion, the indent amount is increased by 2. This causes nodes | ||
870 | * at each level deeper into the binary search tree to be displayed | ||
871 | * with a greater indent. | ||
872 | */ | ||
873 | static void dump_nodes(FILE *stream, struct node *nodep, | ||
874 | unsigned int indent) | ||
875 | { | ||
876 | char *node_type; | ||
877 | |||
878 | /* Dump contents of node */ | ||
879 | if (!nodep->parent) | ||
880 | node_type = "root"; | ||
881 | else if (nodep == nodep->parent->left) | ||
882 | node_type = "left"; | ||
883 | else { | ||
884 | assert(nodep == nodep->parent->right); | ||
885 | node_type = "right"; | ||
886 | } | ||
887 | fprintf(stream, "%*s---- %s nodep: %p\n", indent, "", node_type, nodep); | ||
888 | fprintf(stream, "%*s parent: %p left: %p right: %p\n", indent, "", | ||
889 | nodep->parent, nodep->left, nodep->right); | ||
890 | fprintf(stream, "%*s idx: 0x%lx mask: 0x%x num_after: 0x%lx\n", | ||
891 | indent, "", nodep->idx, nodep->mask, nodep->num_after); | ||
892 | |||
893 | /* If present, dump contents of left child nodes */ | ||
894 | if (nodep->left) | ||
895 | dump_nodes(stream, nodep->left, indent + 2); | ||
896 | |||
897 | /* If present, dump contents of right child nodes */ | ||
898 | if (nodep->right) | ||
899 | dump_nodes(stream, nodep->right, indent + 2); | ||
900 | } | ||
901 | |||
902 | static inline sparsebit_idx_t node_first_set(struct node *nodep, int start) | ||
903 | { | ||
904 | mask_t leading = (mask_t)1 << start; | ||
905 | int n1 = __builtin_ctz(nodep->mask & -leading); | ||
906 | |||
907 | return nodep->idx + n1; | ||
908 | } | ||
909 | |||
910 | static inline sparsebit_idx_t node_first_clear(struct node *nodep, int start) | ||
911 | { | ||
912 | mask_t leading = (mask_t)1 << start; | ||
913 | int n1 = __builtin_ctz(~nodep->mask & -leading); | ||
914 | |||
915 | return nodep->idx + n1; | ||
916 | } | ||
917 | |||
918 | /* Dumps to the FILE stream specified by stream, the implementation dependent | ||
919 | * internal state of s. Each line of output is prefixed with the number | ||
920 | * of spaces given by indent. The output is completely implementation | ||
921 | * dependent and subject to change. Output from this function should only | ||
922 | * be used for diagnostic purposes. For example, this function can be | ||
923 | * used by test cases after they detect an unexpected condition, as a means | ||
924 | * to capture diagnostic information. | ||
925 | */ | ||
926 | static void sparsebit_dump_internal(FILE *stream, struct sparsebit *s, | ||
927 | unsigned int indent) | ||
928 | { | ||
929 | /* Dump the contents of s */ | ||
930 | fprintf(stream, "%*sroot: %p\n", indent, "", s->root); | ||
931 | fprintf(stream, "%*snum_set: 0x%lx\n", indent, "", s->num_set); | ||
932 | |||
933 | if (s->root) | ||
934 | dump_nodes(stream, s->root, indent); | ||
935 | } | ||
936 | |||
937 | /* Allocates and returns a new sparsebit array. The initial state | ||
938 | * of the newly allocated sparsebit array has all bits cleared. | ||
939 | */ | ||
940 | struct sparsebit *sparsebit_alloc(void) | ||
941 | { | ||
942 | struct sparsebit *s; | ||
943 | |||
944 | /* Allocate top level structure. */ | ||
945 | s = calloc(1, sizeof(*s)); | ||
946 | if (!s) { | ||
947 | perror("calloc"); | ||
948 | abort(); | ||
949 | } | ||
950 | |||
951 | return s; | ||
952 | } | ||
953 | |||
954 | /* Frees the implementation dependent data for the sparsebit array | ||
955 | * pointed to by s and poisons the pointer to that data. | ||
956 | */ | ||
957 | void sparsebit_free(struct sparsebit **sbitp) | ||
958 | { | ||
959 | struct sparsebit *s = *sbitp; | ||
960 | |||
961 | if (!s) | ||
962 | return; | ||
963 | |||
964 | sparsebit_clear_all(s); | ||
965 | free(s); | ||
966 | *sbitp = NULL; | ||
967 | } | ||
968 | |||
969 | /* Makes a copy of the sparsebit array given by s, to the sparsebit | ||
970 | * array given by d. Note, d must have already been allocated via | ||
971 | * sparsebit_alloc(). It can though already have bits set, which | ||
972 | * if different from src will be cleared. | ||
973 | */ | ||
974 | void sparsebit_copy(struct sparsebit *d, struct sparsebit *s) | ||
975 | { | ||
976 | /* First clear any bits already set in the destination */ | ||
977 | sparsebit_clear_all(d); | ||
978 | |||
979 | if (s->root) { | ||
980 | d->root = node_copy_subtree(s->root); | ||
981 | d->num_set = s->num_set; | ||
982 | } | ||
983 | } | ||
984 | |||
985 | /* Returns whether num consecutive bits starting at idx are all set. */ | ||
986 | bool sparsebit_is_set_num(struct sparsebit *s, | ||
987 | sparsebit_idx_t idx, sparsebit_num_t num) | ||
988 | { | ||
989 | sparsebit_idx_t next_cleared; | ||
990 | |||
991 | assert(num > 0); | ||
992 | assert(idx + num - 1 >= idx); | ||
993 | |||
994 | /* With num > 0, the first bit must be set. */ | ||
995 | if (!sparsebit_is_set(s, idx)) | ||
996 | return false; | ||
997 | |||
998 | /* Find the next cleared bit */ | ||
999 | next_cleared = sparsebit_next_clear(s, idx); | ||
1000 | |||
1001 | /* | ||
1002 | * If no cleared bits beyond idx, then there are at least num | ||
1003 | * set bits. idx + num doesn't wrap. Otherwise check if | ||
1004 | * there are enough set bits between idx and the next cleared bit. | ||
1005 | */ | ||
1006 | return next_cleared == 0 || next_cleared - idx >= num; | ||
1007 | } | ||
1008 | |||
1009 | /* Returns whether the bit at the index given by idx. */ | ||
1010 | bool sparsebit_is_clear(struct sparsebit *s, | ||
1011 | sparsebit_idx_t idx) | ||
1012 | { | ||
1013 | return !sparsebit_is_set(s, idx); | ||
1014 | } | ||
1015 | |||
1016 | /* Returns whether num consecutive bits starting at idx are all cleared. */ | ||
1017 | bool sparsebit_is_clear_num(struct sparsebit *s, | ||
1018 | sparsebit_idx_t idx, sparsebit_num_t num) | ||
1019 | { | ||
1020 | sparsebit_idx_t next_set; | ||
1021 | |||
1022 | assert(num > 0); | ||
1023 | assert(idx + num - 1 >= idx); | ||
1024 | |||
1025 | /* With num > 0, the first bit must be cleared. */ | ||
1026 | if (!sparsebit_is_clear(s, idx)) | ||
1027 | return false; | ||
1028 | |||
1029 | /* Find the next set bit */ | ||
1030 | next_set = sparsebit_next_set(s, idx); | ||
1031 | |||
1032 | /* | ||
1033 | * If no set bits beyond idx, then there are at least num | ||
1034 | * cleared bits. idx + num doesn't wrap. Otherwise check if | ||
1035 | * there are enough cleared bits between idx and the next set bit. | ||
1036 | */ | ||
1037 | return next_set == 0 || next_set - idx >= num; | ||
1038 | } | ||
1039 | |||
1040 | /* Returns the total number of bits set. Note: 0 is also returned for | ||
1041 | * the case of all bits set. This is because with all bits set, there | ||
1042 | * is 1 additional bit set beyond what can be represented in the return | ||
1043 | * value. Use sparsebit_any_set(), instead of sparsebit_num_set() > 0, | ||
1044 | * to determine if the sparsebit array has any bits set. | ||
1045 | */ | ||
1046 | sparsebit_num_t sparsebit_num_set(struct sparsebit *s) | ||
1047 | { | ||
1048 | return s->num_set; | ||
1049 | } | ||
1050 | |||
1051 | /* Returns whether any bit is set in the sparsebit array. */ | ||
1052 | bool sparsebit_any_set(struct sparsebit *s) | ||
1053 | { | ||
1054 | /* | ||
1055 | * Nodes only describe set bits. If any nodes then there | ||
1056 | * is at least 1 bit set. | ||
1057 | */ | ||
1058 | if (!s->root) | ||
1059 | return false; | ||
1060 | |||
1061 | /* | ||
1062 | * Every node should have a non-zero mask. For now will | ||
1063 | * just assure that the root node has a non-zero mask, | ||
1064 | * which is a quick check that at least 1 bit is set. | ||
1065 | */ | ||
1066 | assert(s->root->mask != 0); | ||
1067 | assert(s->num_set > 0 || | ||
1068 | (s->root->num_after == ((sparsebit_num_t) 0) - MASK_BITS && | ||
1069 | s->root->mask == ~(mask_t) 0)); | ||
1070 | |||
1071 | return true; | ||
1072 | } | ||
1073 | |||
1074 | /* Returns whether all the bits in the sparsebit array are cleared. */ | ||
1075 | bool sparsebit_all_clear(struct sparsebit *s) | ||
1076 | { | ||
1077 | return !sparsebit_any_set(s); | ||
1078 | } | ||
1079 | |||
1080 | /* Returns whether all the bits in the sparsebit array are set. */ | ||
1081 | bool sparsebit_any_clear(struct sparsebit *s) | ||
1082 | { | ||
1083 | return !sparsebit_all_set(s); | ||
1084 | } | ||
1085 | |||
1086 | /* Returns the index of the first set bit. Abort if no bits are set. | ||
1087 | */ | ||
1088 | sparsebit_idx_t sparsebit_first_set(struct sparsebit *s) | ||
1089 | { | ||
1090 | struct node *nodep; | ||
1091 | |||
1092 | /* Validate at least 1 bit is set */ | ||
1093 | assert(sparsebit_any_set(s)); | ||
1094 | |||
1095 | nodep = node_first(s); | ||
1096 | return node_first_set(nodep, 0); | ||
1097 | } | ||
1098 | |||
1099 | /* Returns the index of the first cleared bit. Abort if | ||
1100 | * no bits are cleared. | ||
1101 | */ | ||
1102 | sparsebit_idx_t sparsebit_first_clear(struct sparsebit *s) | ||
1103 | { | ||
1104 | struct node *nodep1, *nodep2; | ||
1105 | |||
1106 | /* Validate at least 1 bit is cleared. */ | ||
1107 | assert(sparsebit_any_clear(s)); | ||
1108 | |||
1109 | /* If no nodes or first node index > 0 then lowest cleared is 0 */ | ||
1110 | nodep1 = node_first(s); | ||
1111 | if (!nodep1 || nodep1->idx > 0) | ||
1112 | return 0; | ||
1113 | |||
1114 | /* Does the mask in the first node contain any cleared bits. */ | ||
1115 | if (nodep1->mask != ~(mask_t) 0) | ||
1116 | return node_first_clear(nodep1, 0); | ||
1117 | |||
1118 | /* | ||
1119 | * All mask bits set in first node. If there isn't a second node | ||
1120 | * then the first cleared bit is the first bit after the bits | ||
1121 | * described by the first node. | ||
1122 | */ | ||
1123 | nodep2 = node_next(s, nodep1); | ||
1124 | if (!nodep2) { | ||
1125 | /* | ||
1126 | * No second node. First cleared bit is first bit beyond | ||
1127 | * bits described by first node. | ||
1128 | */ | ||
1129 | assert(nodep1->mask == ~(mask_t) 0); | ||
1130 | assert(nodep1->idx + MASK_BITS + nodep1->num_after != (sparsebit_idx_t) 0); | ||
1131 | return nodep1->idx + MASK_BITS + nodep1->num_after; | ||
1132 | } | ||
1133 | |||
1134 | /* | ||
1135 | * There is a second node. | ||
1136 | * If it is not adjacent to the first node, then there is a gap | ||
1137 | * of cleared bits between the nodes, and the first cleared bit | ||
1138 | * is the first bit within the gap. | ||
1139 | */ | ||
1140 | if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx) | ||
1141 | return nodep1->idx + MASK_BITS + nodep1->num_after; | ||
1142 | |||
1143 | /* | ||
1144 | * Second node is adjacent to the first node. | ||
1145 | * Because it is adjacent, its mask should be non-zero. If all | ||
1146 | * its mask bits are set, then with it being adjacent, it should | ||
1147 | * have had the mask bits moved into the num_after setting of the | ||
1148 | * previous node. | ||
1149 | */ | ||
1150 | return node_first_clear(nodep2, 0); | ||
1151 | } | ||
1152 | |||
1153 | /* Returns index of next bit set within s after the index given by prev. | ||
1154 | * Returns 0 if there are no bits after prev that are set. | ||
1155 | */ | ||
1156 | sparsebit_idx_t sparsebit_next_set(struct sparsebit *s, | ||
1157 | sparsebit_idx_t prev) | ||
1158 | { | ||
1159 | sparsebit_idx_t lowest_possible = prev + 1; | ||
1160 | sparsebit_idx_t start; | ||
1161 | struct node *nodep; | ||
1162 | |||
1163 | /* A bit after the highest index can't be set. */ | ||
1164 | if (lowest_possible == 0) | ||
1165 | return 0; | ||
1166 | |||
1167 | /* | ||
1168 | * Find the leftmost 'candidate' overlapping or to the right | ||
1169 | * of lowest_possible. | ||
1170 | */ | ||
1171 | struct node *candidate = NULL; | ||
1172 | |||
1173 | /* True iff lowest_possible is within candidate */ | ||
1174 | bool contains = false; | ||
1175 | |||
1176 | /* | ||
1177 | * Find node that describes setting of bit at lowest_possible. | ||
1178 | * If such a node doesn't exist, find the node with the lowest | ||
1179 | * starting index that is > lowest_possible. | ||
1180 | */ | ||
1181 | for (nodep = s->root; nodep;) { | ||
1182 | if ((nodep->idx + MASK_BITS + nodep->num_after - 1) | ||
1183 | >= lowest_possible) { | ||
1184 | candidate = nodep; | ||
1185 | if (candidate->idx <= lowest_possible) { | ||
1186 | contains = true; | ||
1187 | break; | ||
1188 | } | ||
1189 | nodep = nodep->left; | ||
1190 | } else { | ||
1191 | nodep = nodep->right; | ||
1192 | } | ||
1193 | } | ||
1194 | if (!candidate) | ||
1195 | return 0; | ||
1196 | |||
1197 | assert(candidate->mask != 0); | ||
1198 | |||
1199 | /* Does the candidate node describe the setting of lowest_possible? */ | ||
1200 | if (!contains) { | ||
1201 | /* | ||
1202 | * Candidate doesn't describe setting of bit at lowest_possible. | ||
1203 | * Candidate points to the first node with a starting index | ||
1204 | * > lowest_possible. | ||
1205 | */ | ||
1206 | assert(candidate->idx > lowest_possible); | ||
1207 | |||
1208 | return node_first_set(candidate, 0); | ||
1209 | } | ||
1210 | |||
1211 | /* | ||
1212 | * Candidate describes setting of bit at lowest_possible. | ||
1213 | * Note: although the node describes the setting of the bit | ||
1214 | * at lowest_possible, its possible that its setting and the | ||
1215 | * setting of all latter bits described by this node are 0. | ||
1216 | * For now, just handle the cases where this node describes | ||
1217 | * a bit at or after an index of lowest_possible that is set. | ||
1218 | */ | ||
1219 | start = lowest_possible - candidate->idx; | ||
1220 | |||
1221 | if (start < MASK_BITS && candidate->mask >= (1 << start)) | ||
1222 | return node_first_set(candidate, start); | ||
1223 | |||
1224 | if (candidate->num_after) { | ||
1225 | sparsebit_idx_t first_num_after_idx = candidate->idx + MASK_BITS; | ||
1226 | |||
1227 | return lowest_possible < first_num_after_idx | ||
1228 | ? first_num_after_idx : lowest_possible; | ||
1229 | } | ||
1230 | |||
1231 | /* | ||
1232 | * Although candidate node describes setting of bit at | ||
1233 | * the index of lowest_possible, all bits at that index and | ||
1234 | * latter that are described by candidate are cleared. With | ||
1235 | * this, the next bit is the first bit in the next node, if | ||
1236 | * such a node exists. If a next node doesn't exist, then | ||
1237 | * there is no next set bit. | ||
1238 | */ | ||
1239 | candidate = node_next(s, candidate); | ||
1240 | if (!candidate) | ||
1241 | return 0; | ||
1242 | |||
1243 | return node_first_set(candidate, 0); | ||
1244 | } | ||
1245 | |||
1246 | /* Returns index of next bit cleared within s after the index given by prev. | ||
1247 | * Returns 0 if there are no bits after prev that are cleared. | ||
1248 | */ | ||
1249 | sparsebit_idx_t sparsebit_next_clear(struct sparsebit *s, | ||
1250 | sparsebit_idx_t prev) | ||
1251 | { | ||
1252 | sparsebit_idx_t lowest_possible = prev + 1; | ||
1253 | sparsebit_idx_t idx; | ||
1254 | struct node *nodep1, *nodep2; | ||
1255 | |||
1256 | /* A bit after the highest index can't be set. */ | ||
1257 | if (lowest_possible == 0) | ||
1258 | return 0; | ||
1259 | |||
1260 | /* | ||
1261 | * Does a node describing the setting of lowest_possible exist? | ||
1262 | * If not, the bit at lowest_possible is cleared. | ||
1263 | */ | ||
1264 | nodep1 = node_find(s, lowest_possible); | ||
1265 | if (!nodep1) | ||
1266 | return lowest_possible; | ||
1267 | |||
1268 | /* Does a mask bit in node 1 describe the next cleared bit. */ | ||
1269 | for (idx = lowest_possible - nodep1->idx; idx < MASK_BITS; idx++) | ||
1270 | if (!(nodep1->mask & (1 << idx))) | ||
1271 | return nodep1->idx + idx; | ||
1272 | |||
1273 | /* | ||
1274 | * Next cleared bit is not described by node 1. If there | ||
1275 | * isn't a next node, then next cleared bit is described | ||
1276 | * by bit after the bits described by the first node. | ||
1277 | */ | ||
1278 | nodep2 = node_next(s, nodep1); | ||
1279 | if (!nodep2) | ||
1280 | return nodep1->idx + MASK_BITS + nodep1->num_after; | ||
1281 | |||
1282 | /* | ||
1283 | * There is a second node. | ||
1284 | * If it is not adjacent to the first node, then there is a gap | ||
1285 | * of cleared bits between the nodes, and the next cleared bit | ||
1286 | * is the first bit within the gap. | ||
1287 | */ | ||
1288 | if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx) | ||
1289 | return nodep1->idx + MASK_BITS + nodep1->num_after; | ||
1290 | |||
1291 | /* | ||
1292 | * Second node is adjacent to the first node. | ||
1293 | * Because it is adjacent, its mask should be non-zero. If all | ||
1294 | * its mask bits are set, then with it being adjacent, it should | ||
1295 | * have had the mask bits moved into the num_after setting of the | ||
1296 | * previous node. | ||
1297 | */ | ||
1298 | return node_first_clear(nodep2, 0); | ||
1299 | } | ||
1300 | |||
1301 | /* Starting with the index 1 greater than the index given by start, finds | ||
1302 | * and returns the index of the first sequence of num consecutively set | ||
1303 | * bits. Returns a value of 0 of no such sequence exists. | ||
1304 | */ | ||
1305 | sparsebit_idx_t sparsebit_next_set_num(struct sparsebit *s, | ||
1306 | sparsebit_idx_t start, sparsebit_num_t num) | ||
1307 | { | ||
1308 | sparsebit_idx_t idx; | ||
1309 | |||
1310 | assert(num >= 1); | ||
1311 | |||
1312 | for (idx = sparsebit_next_set(s, start); | ||
1313 | idx != 0 && idx + num - 1 >= idx; | ||
1314 | idx = sparsebit_next_set(s, idx)) { | ||
1315 | assert(sparsebit_is_set(s, idx)); | ||
1316 | |||
1317 | /* | ||
1318 | * Does the sequence of bits starting at idx consist of | ||
1319 | * num set bits? | ||
1320 | */ | ||
1321 | if (sparsebit_is_set_num(s, idx, num)) | ||
1322 | return idx; | ||
1323 | |||
1324 | /* | ||
1325 | * Sequence of set bits at idx isn't large enough. | ||
1326 | * Skip this entire sequence of set bits. | ||
1327 | */ | ||
1328 | idx = sparsebit_next_clear(s, idx); | ||
1329 | if (idx == 0) | ||
1330 | return 0; | ||
1331 | } | ||
1332 | |||
1333 | return 0; | ||
1334 | } | ||
1335 | |||
1336 | /* Starting with the index 1 greater than the index given by start, finds | ||
1337 | * and returns the index of the first sequence of num consecutively cleared | ||
1338 | * bits. Returns a value of 0 of no such sequence exists. | ||
1339 | */ | ||
1340 | sparsebit_idx_t sparsebit_next_clear_num(struct sparsebit *s, | ||
1341 | sparsebit_idx_t start, sparsebit_num_t num) | ||
1342 | { | ||
1343 | sparsebit_idx_t idx; | ||
1344 | |||
1345 | assert(num >= 1); | ||
1346 | |||
1347 | for (idx = sparsebit_next_clear(s, start); | ||
1348 | idx != 0 && idx + num - 1 >= idx; | ||
1349 | idx = sparsebit_next_clear(s, idx)) { | ||
1350 | assert(sparsebit_is_clear(s, idx)); | ||
1351 | |||
1352 | /* | ||
1353 | * Does the sequence of bits starting at idx consist of | ||
1354 | * num cleared bits? | ||
1355 | */ | ||
1356 | if (sparsebit_is_clear_num(s, idx, num)) | ||
1357 | return idx; | ||
1358 | |||
1359 | /* | ||
1360 | * Sequence of cleared bits at idx isn't large enough. | ||
1361 | * Skip this entire sequence of cleared bits. | ||
1362 | */ | ||
1363 | idx = sparsebit_next_set(s, idx); | ||
1364 | if (idx == 0) | ||
1365 | return 0; | ||
1366 | } | ||
1367 | |||
1368 | return 0; | ||
1369 | } | ||
1370 | |||
1371 | /* Sets the bits * in the inclusive range idx through idx + num - 1. */ | ||
1372 | void sparsebit_set_num(struct sparsebit *s, | ||
1373 | sparsebit_idx_t start, sparsebit_num_t num) | ||
1374 | { | ||
1375 | struct node *nodep, *next; | ||
1376 | unsigned int n1; | ||
1377 | sparsebit_idx_t idx; | ||
1378 | sparsebit_num_t n; | ||
1379 | sparsebit_idx_t middle_start, middle_end; | ||
1380 | |||
1381 | assert(num > 0); | ||
1382 | assert(start + num - 1 >= start); | ||
1383 | |||
1384 | /* | ||
1385 | * Leading - bits before first mask boundary. | ||
1386 | * | ||
1387 | * TODO(lhuemill): With some effort it may be possible to | ||
1388 | * replace the following loop with a sequential sequence | ||
1389 | * of statements. High level sequence would be: | ||
1390 | * | ||
1391 | * 1. Use node_split() to force node that describes setting | ||
1392 | * of idx to be within the mask portion of a node. | ||
1393 | * 2. Form mask of bits to be set. | ||
1394 | * 3. Determine number of mask bits already set in the node | ||
1395 | * and store in a local variable named num_already_set. | ||
1396 | * 4. Set the appropriate mask bits within the node. | ||
1397 | * 5. Increment struct sparsebit_pvt num_set member | ||
1398 | * by the number of bits that were actually set. | ||
1399 | * Exclude from the counts bits that were already set. | ||
1400 | * 6. Before returning to the caller, use node_reduce() to | ||
1401 | * handle the multiple corner cases that this method | ||
1402 | * introduces. | ||
1403 | */ | ||
1404 | for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--) | ||
1405 | bit_set(s, idx); | ||
1406 | |||
1407 | /* Middle - bits spanning one or more entire mask */ | ||
1408 | middle_start = idx; | ||
1409 | middle_end = middle_start + (n & -MASK_BITS) - 1; | ||
1410 | if (n >= MASK_BITS) { | ||
1411 | nodep = node_split(s, middle_start); | ||
1412 | |||
1413 | /* | ||
1414 | * As needed, split just after end of middle bits. | ||
1415 | * No split needed if end of middle bits is at highest | ||
1416 | * supported bit index. | ||
1417 | */ | ||
1418 | if (middle_end + 1 > middle_end) | ||
1419 | (void) node_split(s, middle_end + 1); | ||
1420 | |||
1421 | /* Delete nodes that only describe bits within the middle. */ | ||
1422 | for (next = node_next(s, nodep); | ||
1423 | next && (next->idx < middle_end); | ||
1424 | next = node_next(s, nodep)) { | ||
1425 | assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end); | ||
1426 | node_rm(s, next); | ||
1427 | next = NULL; | ||
1428 | } | ||
1429 | |||
1430 | /* As needed set each of the mask bits */ | ||
1431 | for (n1 = 0; n1 < MASK_BITS; n1++) { | ||
1432 | if (!(nodep->mask & (1 << n1))) { | ||
1433 | nodep->mask |= 1 << n1; | ||
1434 | s->num_set++; | ||
1435 | } | ||
1436 | } | ||
1437 | |||
1438 | s->num_set -= nodep->num_after; | ||
1439 | nodep->num_after = middle_end - middle_start + 1 - MASK_BITS; | ||
1440 | s->num_set += nodep->num_after; | ||
1441 | |||
1442 | node_reduce(s, nodep); | ||
1443 | } | ||
1444 | idx = middle_end + 1; | ||
1445 | n -= middle_end - middle_start + 1; | ||
1446 | |||
1447 | /* Trailing - bits at and beyond last mask boundary */ | ||
1448 | assert(n < MASK_BITS); | ||
1449 | for (; n > 0; idx++, n--) | ||
1450 | bit_set(s, idx); | ||
1451 | } | ||
1452 | |||
1453 | /* Clears the bits * in the inclusive range idx through idx + num - 1. */ | ||
1454 | void sparsebit_clear_num(struct sparsebit *s, | ||
1455 | sparsebit_idx_t start, sparsebit_num_t num) | ||
1456 | { | ||
1457 | struct node *nodep, *next; | ||
1458 | unsigned int n1; | ||
1459 | sparsebit_idx_t idx; | ||
1460 | sparsebit_num_t n; | ||
1461 | sparsebit_idx_t middle_start, middle_end; | ||
1462 | |||
1463 | assert(num > 0); | ||
1464 | assert(start + num - 1 >= start); | ||
1465 | |||
1466 | /* Leading - bits before first mask boundary */ | ||
1467 | for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--) | ||
1468 | bit_clear(s, idx); | ||
1469 | |||
1470 | /* Middle - bits spanning one or more entire mask */ | ||
1471 | middle_start = idx; | ||
1472 | middle_end = middle_start + (n & -MASK_BITS) - 1; | ||
1473 | if (n >= MASK_BITS) { | ||
1474 | nodep = node_split(s, middle_start); | ||
1475 | |||
1476 | /* | ||
1477 | * As needed, split just after end of middle bits. | ||
1478 | * No split needed if end of middle bits is at highest | ||
1479 | * supported bit index. | ||
1480 | */ | ||
1481 | if (middle_end + 1 > middle_end) | ||
1482 | (void) node_split(s, middle_end + 1); | ||
1483 | |||
1484 | /* Delete nodes that only describe bits within the middle. */ | ||
1485 | for (next = node_next(s, nodep); | ||
1486 | next && (next->idx < middle_end); | ||
1487 | next = node_next(s, nodep)) { | ||
1488 | assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end); | ||
1489 | node_rm(s, next); | ||
1490 | next = NULL; | ||
1491 | } | ||
1492 | |||
1493 | /* As needed clear each of the mask bits */ | ||
1494 | for (n1 = 0; n1 < MASK_BITS; n1++) { | ||
1495 | if (nodep->mask & (1 << n1)) { | ||
1496 | nodep->mask &= ~(1 << n1); | ||
1497 | s->num_set--; | ||
1498 | } | ||
1499 | } | ||
1500 | |||
1501 | /* Clear any bits described by num_after */ | ||
1502 | s->num_set -= nodep->num_after; | ||
1503 | nodep->num_after = 0; | ||
1504 | |||
1505 | /* | ||
1506 | * Delete the node that describes the beginning of | ||
1507 | * the middle bits and perform any allowed reductions | ||
1508 | * with the nodes prev or next of nodep. | ||
1509 | */ | ||
1510 | node_reduce(s, nodep); | ||
1511 | nodep = NULL; | ||
1512 | } | ||
1513 | idx = middle_end + 1; | ||
1514 | n -= middle_end - middle_start + 1; | ||
1515 | |||
1516 | /* Trailing - bits at and beyond last mask boundary */ | ||
1517 | assert(n < MASK_BITS); | ||
1518 | for (; n > 0; idx++, n--) | ||
1519 | bit_clear(s, idx); | ||
1520 | } | ||
1521 | |||
1522 | /* Sets the bit at the index given by idx. */ | ||
1523 | void sparsebit_set(struct sparsebit *s, sparsebit_idx_t idx) | ||
1524 | { | ||
1525 | sparsebit_set_num(s, idx, 1); | ||
1526 | } | ||
1527 | |||
1528 | /* Clears the bit at the index given by idx. */ | ||
1529 | void sparsebit_clear(struct sparsebit *s, sparsebit_idx_t idx) | ||
1530 | { | ||
1531 | sparsebit_clear_num(s, idx, 1); | ||
1532 | } | ||
1533 | |||
1534 | /* Sets the bits in the entire addressable range of the sparsebit array. */ | ||
1535 | void sparsebit_set_all(struct sparsebit *s) | ||
1536 | { | ||
1537 | sparsebit_set(s, 0); | ||
1538 | sparsebit_set_num(s, 1, ~(sparsebit_idx_t) 0); | ||
1539 | assert(sparsebit_all_set(s)); | ||
1540 | } | ||
1541 | |||
1542 | /* Clears the bits in the entire addressable range of the sparsebit array. */ | ||
1543 | void sparsebit_clear_all(struct sparsebit *s) | ||
1544 | { | ||
1545 | sparsebit_clear(s, 0); | ||
1546 | sparsebit_clear_num(s, 1, ~(sparsebit_idx_t) 0); | ||
1547 | assert(!sparsebit_any_set(s)); | ||
1548 | } | ||
1549 | |||
1550 | static size_t display_range(FILE *stream, sparsebit_idx_t low, | ||
1551 | sparsebit_idx_t high, bool prepend_comma_space) | ||
1552 | { | ||
1553 | char *fmt_str; | ||
1554 | size_t sz; | ||
1555 | |||
1556 | /* Determine the printf format string */ | ||
1557 | if (low == high) | ||
1558 | fmt_str = prepend_comma_space ? ", 0x%lx" : "0x%lx"; | ||
1559 | else | ||
1560 | fmt_str = prepend_comma_space ? ", 0x%lx:0x%lx" : "0x%lx:0x%lx"; | ||
1561 | |||
1562 | /* | ||
1563 | * When stream is NULL, just determine the size of what would | ||
1564 | * have been printed, else print the range. | ||
1565 | */ | ||
1566 | if (!stream) | ||
1567 | sz = snprintf(NULL, 0, fmt_str, low, high); | ||
1568 | else | ||
1569 | sz = fprintf(stream, fmt_str, low, high); | ||
1570 | |||
1571 | return sz; | ||
1572 | } | ||
1573 | |||
1574 | |||
1575 | /* Dumps to the FILE stream given by stream, the bit settings | ||
1576 | * of s. Each line of output is prefixed with the number of | ||
1577 | * spaces given by indent. The length of each line is implementation | ||
1578 | * dependent and does not depend on the indent amount. The following | ||
1579 | * is an example output of a sparsebit array that has bits: | ||
1580 | * | ||
1581 | * 0x5, 0x8, 0xa:0xe, 0x12 | ||
1582 | * | ||
1583 | * This corresponds to a sparsebit whose bits 5, 8, 10, 11, 12, 13, 14, 18 | ||
1584 | * are set. Note that a ':', instead of a '-' is used to specify a range of | ||
1585 | * contiguous bits. This is done because '-' is used to specify command-line | ||
1586 | * options, and sometimes ranges are specified as command-line arguments. | ||
1587 | */ | ||
1588 | void sparsebit_dump(FILE *stream, struct sparsebit *s, | ||
1589 | unsigned int indent) | ||
1590 | { | ||
1591 | size_t current_line_len = 0; | ||
1592 | size_t sz; | ||
1593 | struct node *nodep; | ||
1594 | |||
1595 | if (!sparsebit_any_set(s)) | ||
1596 | return; | ||
1597 | |||
1598 | /* Display initial indent */ | ||
1599 | fprintf(stream, "%*s", indent, ""); | ||
1600 | |||
1601 | /* For each node */ | ||
1602 | for (nodep = node_first(s); nodep; nodep = node_next(s, nodep)) { | ||
1603 | unsigned int n1; | ||
1604 | sparsebit_idx_t low, high; | ||
1605 | |||
1606 | /* For each group of bits in the mask */ | ||
1607 | for (n1 = 0; n1 < MASK_BITS; n1++) { | ||
1608 | if (nodep->mask & (1 << n1)) { | ||
1609 | low = high = nodep->idx + n1; | ||
1610 | |||
1611 | for (; n1 < MASK_BITS; n1++) { | ||
1612 | if (nodep->mask & (1 << n1)) | ||
1613 | high = nodep->idx + n1; | ||
1614 | else | ||
1615 | break; | ||
1616 | } | ||
1617 | |||
1618 | if ((n1 == MASK_BITS) && nodep->num_after) | ||
1619 | high += nodep->num_after; | ||
1620 | |||
1621 | /* | ||
1622 | * How much room will it take to display | ||
1623 | * this range. | ||
1624 | */ | ||
1625 | sz = display_range(NULL, low, high, | ||
1626 | current_line_len != 0); | ||
1627 | |||
1628 | /* | ||
1629 | * If there is not enough room, display | ||
1630 | * a newline plus the indent of the next | ||
1631 | * line. | ||
1632 | */ | ||
1633 | if (current_line_len + sz > DUMP_LINE_MAX) { | ||
1634 | fputs("\n", stream); | ||
1635 | fprintf(stream, "%*s", indent, ""); | ||
1636 | current_line_len = 0; | ||
1637 | } | ||
1638 | |||
1639 | /* Display the range */ | ||
1640 | sz = display_range(stream, low, high, | ||
1641 | current_line_len != 0); | ||
1642 | current_line_len += sz; | ||
1643 | } | ||
1644 | } | ||
1645 | |||
1646 | /* | ||
1647 | * If num_after and most significant-bit of mask is not | ||
1648 | * set, then still need to display a range for the bits | ||
1649 | * described by num_after. | ||
1650 | */ | ||
1651 | if (!(nodep->mask & (1 << (MASK_BITS - 1))) && nodep->num_after) { | ||
1652 | low = nodep->idx + MASK_BITS; | ||
1653 | high = nodep->idx + MASK_BITS + nodep->num_after - 1; | ||
1654 | |||
1655 | /* | ||
1656 | * How much room will it take to display | ||
1657 | * this range. | ||
1658 | */ | ||
1659 | sz = display_range(NULL, low, high, | ||
1660 | current_line_len != 0); | ||
1661 | |||
1662 | /* | ||
1663 | * If there is not enough room, display | ||
1664 | * a newline plus the indent of the next | ||
1665 | * line. | ||
1666 | */ | ||
1667 | if (current_line_len + sz > DUMP_LINE_MAX) { | ||
1668 | fputs("\n", stream); | ||
1669 | fprintf(stream, "%*s", indent, ""); | ||
1670 | current_line_len = 0; | ||
1671 | } | ||
1672 | |||
1673 | /* Display the range */ | ||
1674 | sz = display_range(stream, low, high, | ||
1675 | current_line_len != 0); | ||
1676 | current_line_len += sz; | ||
1677 | } | ||
1678 | } | ||
1679 | fputs("\n", stream); | ||
1680 | } | ||
1681 | |||
1682 | /* Validates the internal state of the sparsebit array given by | ||
1683 | * s. On error, diagnostic information is printed to stderr and | ||
1684 | * abort is called. | ||
1685 | */ | ||
1686 | void sparsebit_validate_internal(struct sparsebit *s) | ||
1687 | { | ||
1688 | bool error_detected = false; | ||
1689 | struct node *nodep, *prev = NULL; | ||
1690 | sparsebit_num_t total_bits_set = 0; | ||
1691 | unsigned int n1; | ||
1692 | |||
1693 | /* For each node */ | ||
1694 | for (nodep = node_first(s); nodep; | ||
1695 | prev = nodep, nodep = node_next(s, nodep)) { | ||
1696 | |||
1697 | /* | ||
1698 | * Increase total bits set by the number of bits set | ||
1699 | * in this node. | ||
1700 | */ | ||
1701 | for (n1 = 0; n1 < MASK_BITS; n1++) | ||
1702 | if (nodep->mask & (1 << n1)) | ||
1703 | total_bits_set++; | ||
1704 | |||
1705 | total_bits_set += nodep->num_after; | ||
1706 | |||
1707 | /* | ||
1708 | * Arbitrary choice as to whether a mask of 0 is allowed | ||
1709 | * or not. For diagnostic purposes it is beneficial to | ||
1710 | * have only one valid means to represent a set of bits. | ||
1711 | * To support this an arbitrary choice has been made | ||
1712 | * to not allow a mask of zero. | ||
1713 | */ | ||
1714 | if (nodep->mask == 0) { | ||
1715 | fprintf(stderr, "Node mask of zero, " | ||
1716 | "nodep: %p nodep->mask: 0x%x", | ||
1717 | nodep, nodep->mask); | ||
1718 | error_detected = true; | ||
1719 | break; | ||
1720 | } | ||
1721 | |||
1722 | /* | ||
1723 | * Validate num_after is not greater than the max index | ||
1724 | * - the number of mask bits. The num_after member | ||
1725 | * uses 0-based indexing and thus has no value that | ||
1726 | * represents all bits set. This limitation is handled | ||
1727 | * by requiring a non-zero mask. With a non-zero mask, | ||
1728 | * MASK_BITS worth of bits are described by the mask, | ||
1729 | * which makes the largest needed num_after equal to: | ||
1730 | * | ||
1731 | * (~(sparsebit_num_t) 0) - MASK_BITS + 1 | ||
1732 | */ | ||
1733 | if (nodep->num_after | ||
1734 | > (~(sparsebit_num_t) 0) - MASK_BITS + 1) { | ||
1735 | fprintf(stderr, "num_after too large, " | ||
1736 | "nodep: %p nodep->num_after: 0x%lx", | ||
1737 | nodep, nodep->num_after); | ||
1738 | error_detected = true; | ||
1739 | break; | ||
1740 | } | ||
1741 | |||
1742 | /* Validate node index is divisible by the mask size */ | ||
1743 | if (nodep->idx % MASK_BITS) { | ||
1744 | fprintf(stderr, "Node index not divisable by " | ||
1745 | "mask size,\n" | ||
1746 | " nodep: %p nodep->idx: 0x%lx " | ||
1747 | "MASK_BITS: %lu\n", | ||
1748 | nodep, nodep->idx, MASK_BITS); | ||
1749 | error_detected = true; | ||
1750 | break; | ||
1751 | } | ||
1752 | |||
1753 | /* | ||
1754 | * Validate bits described by node don't wrap beyond the | ||
1755 | * highest supported index. | ||
1756 | */ | ||
1757 | if ((nodep->idx + MASK_BITS + nodep->num_after - 1) < nodep->idx) { | ||
1758 | fprintf(stderr, "Bits described by node wrap " | ||
1759 | "beyond highest supported index,\n" | ||
1760 | " nodep: %p nodep->idx: 0x%lx\n" | ||
1761 | " MASK_BITS: %lu nodep->num_after: 0x%lx", | ||
1762 | nodep, nodep->idx, MASK_BITS, nodep->num_after); | ||
1763 | error_detected = true; | ||
1764 | break; | ||
1765 | } | ||
1766 | |||
1767 | /* Check parent pointers. */ | ||
1768 | if (nodep->left) { | ||
1769 | if (nodep->left->parent != nodep) { | ||
1770 | fprintf(stderr, "Left child parent pointer " | ||
1771 | "doesn't point to this node,\n" | ||
1772 | " nodep: %p nodep->left: %p " | ||
1773 | "nodep->left->parent: %p", | ||
1774 | nodep, nodep->left, | ||
1775 | nodep->left->parent); | ||
1776 | error_detected = true; | ||
1777 | break; | ||
1778 | } | ||
1779 | } | ||
1780 | |||
1781 | if (nodep->right) { | ||
1782 | if (nodep->right->parent != nodep) { | ||
1783 | fprintf(stderr, "Right child parent pointer " | ||
1784 | "doesn't point to this node,\n" | ||
1785 | " nodep: %p nodep->right: %p " | ||
1786 | "nodep->right->parent: %p", | ||
1787 | nodep, nodep->right, | ||
1788 | nodep->right->parent); | ||
1789 | error_detected = true; | ||
1790 | break; | ||
1791 | } | ||
1792 | } | ||
1793 | |||
1794 | if (!nodep->parent) { | ||
1795 | if (s->root != nodep) { | ||
1796 | fprintf(stderr, "Unexpected root node, " | ||
1797 | "s->root: %p nodep: %p", | ||
1798 | s->root, nodep); | ||
1799 | error_detected = true; | ||
1800 | break; | ||
1801 | } | ||
1802 | } | ||
1803 | |||
1804 | if (prev) { | ||
1805 | /* | ||
1806 | * Is index of previous node before index of | ||
1807 | * current node? | ||
1808 | */ | ||
1809 | if (prev->idx >= nodep->idx) { | ||
1810 | fprintf(stderr, "Previous node index " | ||
1811 | ">= current node index,\n" | ||
1812 | " prev: %p prev->idx: 0x%lx\n" | ||
1813 | " nodep: %p nodep->idx: 0x%lx", | ||
1814 | prev, prev->idx, nodep, nodep->idx); | ||
1815 | error_detected = true; | ||
1816 | break; | ||
1817 | } | ||
1818 | |||
1819 | /* | ||
1820 | * Nodes occur in asscending order, based on each | ||
1821 | * nodes starting index. | ||
1822 | */ | ||
1823 | if ((prev->idx + MASK_BITS + prev->num_after - 1) | ||
1824 | >= nodep->idx) { | ||
1825 | fprintf(stderr, "Previous node bit range " | ||
1826 | "overlap with current node bit range,\n" | ||
1827 | " prev: %p prev->idx: 0x%lx " | ||
1828 | "prev->num_after: 0x%lx\n" | ||
1829 | " nodep: %p nodep->idx: 0x%lx " | ||
1830 | "nodep->num_after: 0x%lx\n" | ||
1831 | " MASK_BITS: %lu", | ||
1832 | prev, prev->idx, prev->num_after, | ||
1833 | nodep, nodep->idx, nodep->num_after, | ||
1834 | MASK_BITS); | ||
1835 | error_detected = true; | ||
1836 | break; | ||
1837 | } | ||
1838 | |||
1839 | /* | ||
1840 | * When the node has all mask bits set, it shouldn't | ||
1841 | * be adjacent to the last bit described by the | ||
1842 | * previous node. | ||
1843 | */ | ||
1844 | if (nodep->mask == ~(mask_t) 0 && | ||
1845 | prev->idx + MASK_BITS + prev->num_after == nodep->idx) { | ||
1846 | fprintf(stderr, "Current node has mask with " | ||
1847 | "all bits set and is adjacent to the " | ||
1848 | "previous node,\n" | ||
1849 | " prev: %p prev->idx: 0x%lx " | ||
1850 | "prev->num_after: 0x%lx\n" | ||
1851 | " nodep: %p nodep->idx: 0x%lx " | ||
1852 | "nodep->num_after: 0x%lx\n" | ||
1853 | " MASK_BITS: %lu", | ||
1854 | prev, prev->idx, prev->num_after, | ||
1855 | nodep, nodep->idx, nodep->num_after, | ||
1856 | MASK_BITS); | ||
1857 | |||
1858 | error_detected = true; | ||
1859 | break; | ||
1860 | } | ||
1861 | } | ||
1862 | } | ||
1863 | |||
1864 | if (!error_detected) { | ||
1865 | /* | ||
1866 | * Is sum of bits set in each node equal to the count | ||
1867 | * of total bits set. | ||
1868 | */ | ||
1869 | if (s->num_set != total_bits_set) { | ||
1870 | fprintf(stderr, "Number of bits set missmatch,\n" | ||
1871 | " s->num_set: 0x%lx total_bits_set: 0x%lx", | ||
1872 | s->num_set, total_bits_set); | ||
1873 | |||
1874 | error_detected = true; | ||
1875 | } | ||
1876 | } | ||
1877 | |||
1878 | if (error_detected) { | ||
1879 | fputs(" dump_internal:\n", stderr); | ||
1880 | sparsebit_dump_internal(stderr, s, 4); | ||
1881 | abort(); | ||
1882 | } | ||
1883 | } | ||
1884 | |||
1885 | |||
1886 | #ifdef FUZZ | ||
1887 | /* A simple but effective fuzzing driver. Look for bugs with the help | ||
1888 | * of some invariants and of a trivial representation of sparsebit. | ||
1889 | * Just use 512 bytes of /dev/zero and /dev/urandom as inputs, and let | ||
1890 | * afl-fuzz do the magic. :) | ||
1891 | */ | ||
1892 | |||
1893 | #include <stdlib.h> | ||
1894 | #include <assert.h> | ||
1895 | |||
1896 | struct range { | ||
1897 | sparsebit_idx_t first, last; | ||
1898 | bool set; | ||
1899 | }; | ||
1900 | |||
1901 | struct sparsebit *s; | ||
1902 | struct range ranges[1000]; | ||
1903 | int num_ranges; | ||
1904 | |||
1905 | static bool get_value(sparsebit_idx_t idx) | ||
1906 | { | ||
1907 | int i; | ||
1908 | |||
1909 | for (i = num_ranges; --i >= 0; ) | ||
1910 | if (ranges[i].first <= idx && idx <= ranges[i].last) | ||
1911 | return ranges[i].set; | ||
1912 | |||
1913 | return false; | ||
1914 | } | ||
1915 | |||
1916 | static void operate(int code, sparsebit_idx_t first, sparsebit_idx_t last) | ||
1917 | { | ||
1918 | sparsebit_num_t num; | ||
1919 | sparsebit_idx_t next; | ||
1920 | |||
1921 | if (first < last) { | ||
1922 | num = last - first + 1; | ||
1923 | } else { | ||
1924 | num = first - last + 1; | ||
1925 | first = last; | ||
1926 | last = first + num - 1; | ||
1927 | } | ||
1928 | |||
1929 | switch (code) { | ||
1930 | case 0: | ||
1931 | sparsebit_set(s, first); | ||
1932 | assert(sparsebit_is_set(s, first)); | ||
1933 | assert(!sparsebit_is_clear(s, first)); | ||
1934 | assert(sparsebit_any_set(s)); | ||
1935 | assert(!sparsebit_all_clear(s)); | ||
1936 | if (get_value(first)) | ||
1937 | return; | ||
1938 | if (num_ranges == 1000) | ||
1939 | exit(0); | ||
1940 | ranges[num_ranges++] = (struct range) | ||
1941 | { .first = first, .last = first, .set = true }; | ||
1942 | break; | ||
1943 | case 1: | ||
1944 | sparsebit_clear(s, first); | ||
1945 | assert(!sparsebit_is_set(s, first)); | ||
1946 | assert(sparsebit_is_clear(s, first)); | ||
1947 | assert(sparsebit_any_clear(s)); | ||
1948 | assert(!sparsebit_all_set(s)); | ||
1949 | if (!get_value(first)) | ||
1950 | return; | ||
1951 | if (num_ranges == 1000) | ||
1952 | exit(0); | ||
1953 | ranges[num_ranges++] = (struct range) | ||
1954 | { .first = first, .last = first, .set = false }; | ||
1955 | break; | ||
1956 | case 2: | ||
1957 | assert(sparsebit_is_set(s, first) == get_value(first)); | ||
1958 | assert(sparsebit_is_clear(s, first) == !get_value(first)); | ||
1959 | break; | ||
1960 | case 3: | ||
1961 | if (sparsebit_any_set(s)) | ||
1962 | assert(get_value(sparsebit_first_set(s))); | ||
1963 | if (sparsebit_any_clear(s)) | ||
1964 | assert(!get_value(sparsebit_first_clear(s))); | ||
1965 | sparsebit_set_all(s); | ||
1966 | assert(!sparsebit_any_clear(s)); | ||
1967 | assert(sparsebit_all_set(s)); | ||
1968 | num_ranges = 0; | ||
1969 | ranges[num_ranges++] = (struct range) | ||
1970 | { .first = 0, .last = ~(sparsebit_idx_t)0, .set = true }; | ||
1971 | break; | ||
1972 | case 4: | ||
1973 | if (sparsebit_any_set(s)) | ||
1974 | assert(get_value(sparsebit_first_set(s))); | ||
1975 | if (sparsebit_any_clear(s)) | ||
1976 | assert(!get_value(sparsebit_first_clear(s))); | ||
1977 | sparsebit_clear_all(s); | ||
1978 | assert(!sparsebit_any_set(s)); | ||
1979 | assert(sparsebit_all_clear(s)); | ||
1980 | num_ranges = 0; | ||
1981 | break; | ||
1982 | case 5: | ||
1983 | next = sparsebit_next_set(s, first); | ||
1984 | assert(next == 0 || next > first); | ||
1985 | assert(next == 0 || get_value(next)); | ||
1986 | break; | ||
1987 | case 6: | ||
1988 | next = sparsebit_next_clear(s, first); | ||
1989 | assert(next == 0 || next > first); | ||
1990 | assert(next == 0 || !get_value(next)); | ||
1991 | break; | ||
1992 | case 7: | ||
1993 | next = sparsebit_next_clear(s, first); | ||
1994 | if (sparsebit_is_set_num(s, first, num)) { | ||
1995 | assert(next == 0 || next > last); | ||
1996 | if (first) | ||
1997 | next = sparsebit_next_set(s, first - 1); | ||
1998 | else if (sparsebit_any_set(s)) | ||
1999 | next = sparsebit_first_set(s); | ||
2000 | else | ||
2001 | return; | ||
2002 | assert(next == first); | ||
2003 | } else { | ||
2004 | assert(sparsebit_is_clear(s, first) || next <= last); | ||
2005 | } | ||
2006 | break; | ||
2007 | case 8: | ||
2008 | next = sparsebit_next_set(s, first); | ||
2009 | if (sparsebit_is_clear_num(s, first, num)) { | ||
2010 | assert(next == 0 || next > last); | ||
2011 | if (first) | ||
2012 | next = sparsebit_next_clear(s, first - 1); | ||
2013 | else if (sparsebit_any_clear(s)) | ||
2014 | next = sparsebit_first_clear(s); | ||
2015 | else | ||
2016 | return; | ||
2017 | assert(next == first); | ||
2018 | } else { | ||
2019 | assert(sparsebit_is_set(s, first) || next <= last); | ||
2020 | } | ||
2021 | break; | ||
2022 | case 9: | ||
2023 | sparsebit_set_num(s, first, num); | ||
2024 | assert(sparsebit_is_set_num(s, first, num)); | ||
2025 | assert(!sparsebit_is_clear_num(s, first, num)); | ||
2026 | assert(sparsebit_any_set(s)); | ||
2027 | assert(!sparsebit_all_clear(s)); | ||
2028 | if (num_ranges == 1000) | ||
2029 | exit(0); | ||
2030 | ranges[num_ranges++] = (struct range) | ||
2031 | { .first = first, .last = last, .set = true }; | ||
2032 | break; | ||
2033 | case 10: | ||
2034 | sparsebit_clear_num(s, first, num); | ||
2035 | assert(!sparsebit_is_set_num(s, first, num)); | ||
2036 | assert(sparsebit_is_clear_num(s, first, num)); | ||
2037 | assert(sparsebit_any_clear(s)); | ||
2038 | assert(!sparsebit_all_set(s)); | ||
2039 | if (num_ranges == 1000) | ||
2040 | exit(0); | ||
2041 | ranges[num_ranges++] = (struct range) | ||
2042 | { .first = first, .last = last, .set = false }; | ||
2043 | break; | ||
2044 | case 11: | ||
2045 | sparsebit_validate_internal(s); | ||
2046 | break; | ||
2047 | default: | ||
2048 | break; | ||
2049 | } | ||
2050 | } | ||
2051 | |||
2052 | unsigned char get8(void) | ||
2053 | { | ||
2054 | int ch; | ||
2055 | |||
2056 | ch = getchar(); | ||
2057 | if (ch == EOF) | ||
2058 | exit(0); | ||
2059 | return ch; | ||
2060 | } | ||
2061 | |||
2062 | uint64_t get64(void) | ||
2063 | { | ||
2064 | uint64_t x; | ||
2065 | |||
2066 | x = get8(); | ||
2067 | x = (x << 8) | get8(); | ||
2068 | x = (x << 8) | get8(); | ||
2069 | x = (x << 8) | get8(); | ||
2070 | x = (x << 8) | get8(); | ||
2071 | x = (x << 8) | get8(); | ||
2072 | x = (x << 8) | get8(); | ||
2073 | return (x << 8) | get8(); | ||
2074 | } | ||
2075 | |||
2076 | int main(void) | ||
2077 | { | ||
2078 | s = sparsebit_alloc(); | ||
2079 | for (;;) { | ||
2080 | uint8_t op = get8() & 0xf; | ||
2081 | uint64_t first = get64(); | ||
2082 | uint64_t last = get64(); | ||
2083 | |||
2084 | operate(op, first, last); | ||
2085 | } | ||
2086 | } | ||
2087 | #endif | ||