mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-04 15:40:44 +00:00
subr_rangeset: use pctrie_reclaim_cb in remove_all
Replace the lookup-remove loop in rangeet_remove_all with a call to SWAP_PCTRIE_RECLAIM_CALLBACK, to eliminate repeated trie searches. Reviewed by: rlibby Differential Revision: https://reviews.freebsd.org/D45584
This commit is contained in:
parent
d2acf0a447
commit
a7f67ebd82
|
@ -232,18 +232,20 @@ rangeset_remove(struct rangeset *rs, uint64_t start, uint64_t end)
|
|||
return (rangeset_remove_pred(rs, start, end, rangeset_true_pred));
|
||||
}
|
||||
|
||||
static void
|
||||
rangeset_remove_leaf(void *rv, void *rsv)
|
||||
{
|
||||
struct rs_el *r = rv;
|
||||
struct rangeset *rs = rsv;
|
||||
|
||||
rs->rs_free_data(rs->rs_data_ctx, r);
|
||||
}
|
||||
|
||||
void
|
||||
rangeset_remove_all(struct rangeset *rs)
|
||||
{
|
||||
struct rs_el *r;
|
||||
|
||||
for (;;) {
|
||||
r = RANGESET_PCTRIE_LOOKUP_GE(&rs->rs_trie, 0);
|
||||
if (r == NULL)
|
||||
break;
|
||||
RANGESET_PCTRIE_REMOVE(&rs->rs_trie, r->re_start);
|
||||
rs->rs_free_data(rs->rs_data_ctx, r);
|
||||
}
|
||||
RANGESET_PCTRIE_RECLAIM_CALLBACK(&rs->rs_trie,
|
||||
rangeset_remove_leaf, rs);
|
||||
}
|
||||
|
||||
void *
|
||||
|
|
Loading…
Reference in a new issue