mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-04 23:50:27 +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));
|
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
|
void
|
||||||
rangeset_remove_all(struct rangeset *rs)
|
rangeset_remove_all(struct rangeset *rs)
|
||||||
{
|
{
|
||||||
struct rs_el *r;
|
RANGESET_PCTRIE_RECLAIM_CALLBACK(&rs->rs_trie,
|
||||||
|
rangeset_remove_leaf, rs);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
|
Loading…
Reference in a new issue