* blist_stats() - dump radix tree stats */
| 528 | * blist_stats() - dump radix tree stats |
| 529 | */ |
| 530 | void |
| 531 | blist_stats(blist_t bl, struct sbuf *s) |
| 532 | { |
| 533 | struct gap_stats gstats; |
| 534 | struct gap_stats *stats = &gstats; |
| 535 | daddr_t i, nodes, radix; |
| 536 | u_daddr_t diff, mask; |
| 537 | int digit; |
| 538 | |
| 539 | init_gap_stats(stats); |
| 540 | nodes = 0; |
| 541 | radix = bl->bl_radix; |
| 542 | for (i = 0; i < bl->bl_blocks; ) { |
| 543 | /* |
| 544 | * Check for skippable subtrees starting at i. |
| 545 | */ |
| 546 | while (radix != 1) { |
| 547 | if (bl->bl_root[nodes].bm_bitmap == 0) { |
| 548 | if (gap_stats_counting(stats)) |
| 549 | update_gap_stats(stats, i); |
| 550 | break; |
| 551 | } |
| 552 | |
| 553 | /* |
| 554 | * Skip subtree root. |
| 555 | */ |
| 556 | nodes++; |
| 557 | radix /= BLIST_RADIX; |
| 558 | } |
| 559 | if (radix == 1) { |
| 560 | /* |
| 561 | * Scan leaf. |
| 562 | */ |
| 563 | mask = bl->bl_root[nodes].bm_bitmap; |
| 564 | diff = mask ^ (mask << 1); |
| 565 | if (gap_stats_counting(stats)) |
| 566 | diff ^= 1; |
| 567 | while (diff != 0) { |
| 568 | digit = bitpos(diff); |
| 569 | update_gap_stats(stats, i + digit); |
| 570 | diff ^= bitrange(digit, 1); |
| 571 | } |
| 572 | } |
| 573 | nodes += radix_to_skip(radix * BLIST_RADIX); |
| 574 | i += radix * BLIST_RADIX; |
| 575 | |
| 576 | /* |
| 577 | * Find max size subtree starting at i. |
| 578 | */ |
| 579 | for (radix = 1; |
| 580 | ((i / BLIST_RADIX / radix) & BLIST_MASK) == 0; |
| 581 | radix *= BLIST_RADIX) |
| 582 | ; |
| 583 | } |
| 584 | update_gap_stats(stats, i); |
| 585 | dump_gap_stats(stats, s); |
| 586 | } |
| 587 |
no test coverage detected