mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
Restore avl_update() calls and related functions
The macOS kmem implementation uses avl_update() and related functions. These same function exist in the Solaris AVL code but were removed because they were unused. Restore them. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Jorgen Lundman <lundman@lundman.net> Closes #10390
This commit is contained in:
parent
3bf3b164ee
commit
081de9a86d
@ -259,6 +259,17 @@ extern void avl_add(avl_tree_t *tree, void *node);
|
|||||||
*/
|
*/
|
||||||
extern void avl_remove(avl_tree_t *tree, void *node);
|
extern void avl_remove(avl_tree_t *tree, void *node);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reinsert a node only if its order has changed relative to its nearest
|
||||||
|
* neighbors. To optimize performance avl_update_lt() checks only the previous
|
||||||
|
* node and avl_update_gt() checks only the next node. Use avl_update_lt() and
|
||||||
|
* avl_update_gt() only if you know the direction in which the order of the
|
||||||
|
* node may change.
|
||||||
|
*/
|
||||||
|
extern boolean_t avl_update(avl_tree_t *, void *);
|
||||||
|
extern boolean_t avl_update_lt(avl_tree_t *, void *);
|
||||||
|
extern boolean_t avl_update_gt(avl_tree_t *, void *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Swaps the contents of the two trees.
|
* Swaps the contents of the two trees.
|
||||||
*/
|
*/
|
||||||
|
@ -809,6 +809,64 @@ avl_remove(avl_tree_t *tree, void *data)
|
|||||||
} while (parent != NULL);
|
} while (parent != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define AVL_REINSERT(tree, obj) \
|
||||||
|
avl_remove((tree), (obj)); \
|
||||||
|
avl_add((tree), (obj))
|
||||||
|
|
||||||
|
boolean_t
|
||||||
|
avl_update_lt(avl_tree_t *t, void *obj)
|
||||||
|
{
|
||||||
|
void *neighbor;
|
||||||
|
|
||||||
|
ASSERT(((neighbor = AVL_NEXT(t, obj)) == NULL) ||
|
||||||
|
(t->avl_compar(obj, neighbor) <= 0));
|
||||||
|
|
||||||
|
neighbor = AVL_PREV(t, obj);
|
||||||
|
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) < 0)) {
|
||||||
|
AVL_REINSERT(t, obj);
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (B_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean_t
|
||||||
|
avl_update_gt(avl_tree_t *t, void *obj)
|
||||||
|
{
|
||||||
|
void *neighbor;
|
||||||
|
|
||||||
|
ASSERT(((neighbor = AVL_PREV(t, obj)) == NULL) ||
|
||||||
|
(t->avl_compar(obj, neighbor) >= 0));
|
||||||
|
|
||||||
|
neighbor = AVL_NEXT(t, obj);
|
||||||
|
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) > 0)) {
|
||||||
|
AVL_REINSERT(t, obj);
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (B_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean_t
|
||||||
|
avl_update(avl_tree_t *t, void *obj)
|
||||||
|
{
|
||||||
|
void *neighbor;
|
||||||
|
|
||||||
|
neighbor = AVL_PREV(t, obj);
|
||||||
|
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) < 0)) {
|
||||||
|
AVL_REINSERT(t, obj);
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
neighbor = AVL_NEXT(t, obj);
|
||||||
|
if ((neighbor != NULL) && (t->avl_compar(obj, neighbor) > 0)) {
|
||||||
|
AVL_REINSERT(t, obj);
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (B_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
avl_swap(avl_tree_t *tree1, avl_tree_t *tree2)
|
avl_swap(avl_tree_t *tree1, avl_tree_t *tree2)
|
||||||
{
|
{
|
||||||
@ -1030,3 +1088,6 @@ EXPORT_SYMBOL(avl_remove);
|
|||||||
EXPORT_SYMBOL(avl_numnodes);
|
EXPORT_SYMBOL(avl_numnodes);
|
||||||
EXPORT_SYMBOL(avl_destroy_nodes);
|
EXPORT_SYMBOL(avl_destroy_nodes);
|
||||||
EXPORT_SYMBOL(avl_destroy);
|
EXPORT_SYMBOL(avl_destroy);
|
||||||
|
EXPORT_SYMBOL(avl_update_lt);
|
||||||
|
EXPORT_SYMBOL(avl_update_gt);
|
||||||
|
EXPORT_SYMBOL(avl_update);
|
||||||
|
Loading…
Reference in New Issue
Block a user