Commit d5359ed30 for imagemagick.org
commit d5359ed304cf0dd7c2a7abf75a39e290ffa43b76
Author: Dirk Lemstra <dirk@lemstra.org>
Date: Sat Nov 14 11:12:00 2026 +0100
Move node removal in the splay tree to a single method.
diff --git a/MagickCore/splay-tree.c b/MagickCore/splay-tree.c
index e9b6af48a..61f98ada5 100644
--- a/MagickCore/splay-tree.c
+++ b/MagickCore/splay-tree.c
@@ -121,6 +121,32 @@ static int
static void
SplaySplayTree(SplayTreeInfo *,const void *);
+
+/* The caller holds the tree semaphore. */
+static NodeInfo *DetachRootFromSplayTree(SplayTreeInfo *splay_tree)
+{
+ NodeInfo
+ *left,
+ *node,
+ *right;
+
+ node=splay_tree->root;
+ left=node->left;
+ right=node->right;
+ splay_tree->root=right;
+ if (left != (NodeInfo *) NULL)
+ {
+ splay_tree->root=left;
+ if (right != (NodeInfo *) NULL)
+ {
+ while (left->right != (NodeInfo *) NULL)
+ left=left->right;
+ left->right=right;
+ }
+ }
+ splay_tree->nodes--;
+ return(node);
+}
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -516,10 +542,6 @@ MagickExport MagickBooleanType DeleteNodeByValueFromSplayTree(
int
compare;
- NodeInfo
- *left,
- *right;
-
void
*key;
@@ -539,31 +561,14 @@ MagickExport MagickBooleanType DeleteNodeByValueFromSplayTree(
UnlockSemaphoreInfo(splay_tree->semaphore);
return(MagickFalse);
}
- left=splay_tree->root->left;
- right=splay_tree->root->right;
+ node=DetachRootFromSplayTree(splay_tree);
if ((splay_tree->relinquish_value != (void *(*)(void *)) NULL) &&
- (splay_tree->root->value != (void *) NULL))
- splay_tree->root->value=splay_tree->relinquish_value(
- splay_tree->root->value);
+ (node->value != (void *) NULL))
+ node->value=splay_tree->relinquish_value(node->value);
if ((splay_tree->relinquish_key != (void *(*)(void *)) NULL) &&
- (splay_tree->root->key != (void *) NULL))
- splay_tree->root->key=splay_tree->relinquish_key(
- splay_tree->root->key);
- splay_tree->root=(NodeInfo *) RelinquishMagickMemory(splay_tree->root);
- splay_tree->nodes--;
- if (left == (NodeInfo *) NULL)
- {
- splay_tree->root=right;
- UnlockSemaphoreInfo(splay_tree->semaphore);
- return(MagickTrue);
- }
- splay_tree->root=left;
- if (right != (NodeInfo *) NULL)
- {
- while (left->right != (NodeInfo *) NULL)
- left=left->right;
- left->right=right;
- }
+ (node->key != (void *) NULL))
+ node->key=splay_tree->relinquish_key(node->key);
+ node=(NodeInfo *) RelinquishMagickMemory(node);
UnlockSemaphoreInfo(splay_tree->semaphore);
return(MagickTrue);
}
@@ -606,8 +611,7 @@ MagickExport MagickBooleanType DeleteNodeFromSplayTree(
compare;
NodeInfo
- *left,
- *right;
+ *node;
assert(splay_tree != (SplayTreeInfo *) NULL);
assert(splay_tree->signature == MagickCoreSignature);
@@ -628,30 +632,14 @@ MagickExport MagickBooleanType DeleteNodeFromSplayTree(
UnlockSemaphoreInfo(splay_tree->semaphore);
return(MagickFalse);
}
- left=splay_tree->root->left;
- right=splay_tree->root->right;
+ node=DetachRootFromSplayTree(splay_tree);
if ((splay_tree->relinquish_value != (void *(*)(void *)) NULL) &&
- (splay_tree->root->value != (void *) NULL))
- splay_tree->root->value=splay_tree->relinquish_value(
- splay_tree->root->value);
+ (node->value != (void *) NULL))
+ node->value=splay_tree->relinquish_value(node->value);
if ((splay_tree->relinquish_key != (void *(*)(void *)) NULL) &&
- (splay_tree->root->key != (void *) NULL))
- splay_tree->root->key=splay_tree->relinquish_key(splay_tree->root->key);
- splay_tree->root=(NodeInfo *) RelinquishMagickMemory(splay_tree->root);
- splay_tree->nodes--;
- if (left == (NodeInfo *) NULL)
- {
- splay_tree->root=right;
- UnlockSemaphoreInfo(splay_tree->semaphore);
- return(MagickTrue);
- }
- splay_tree->root=left;
- if (right != (NodeInfo *) NULL)
- {
- while (left->right != (NodeInfo *) NULL)
- left=left->right;
- left->right=right;
- }
+ (node->key != (void *) NULL))
+ node->key=splay_tree->relinquish_key(node->key);
+ node=(NodeInfo *) RelinquishMagickMemory(node);
UnlockSemaphoreInfo(splay_tree->semaphore);
return(MagickTrue);
}
@@ -1217,10 +1205,6 @@ MagickExport void *RemoveNodeByValueFromSplayTree(SplayTreeInfo *splay_tree,
int
compare;
- NodeInfo
- *left,
- *right;
-
/*
We found the node that matches the value; now remove it.
*/
@@ -1237,27 +1221,11 @@ MagickExport void *RemoveNodeByValueFromSplayTree(SplayTreeInfo *splay_tree,
UnlockSemaphoreInfo(splay_tree->semaphore);
return(key);
}
- left=splay_tree->root->left;
- right=splay_tree->root->right;
+ node=DetachRootFromSplayTree(splay_tree);
if ((splay_tree->relinquish_value != (void *(*)(void *)) NULL) &&
- (splay_tree->root->value != (void *) NULL))
- splay_tree->root->value=splay_tree->relinquish_value(
- splay_tree->root->value);
- splay_tree->root=(NodeInfo *) RelinquishMagickMemory(splay_tree->root);
- splay_tree->nodes--;
- if (left == (NodeInfo *) NULL)
- {
- splay_tree->root=right;
- UnlockSemaphoreInfo(splay_tree->semaphore);
- return(key);
- }
- splay_tree->root=left;
- if (right != (NodeInfo *) NULL)
- {
- while (left->right != (NodeInfo *) NULL)
- left=left->right;
- left->right=right;
- }
+ (node->value != (void *) NULL))
+ node->value=splay_tree->relinquish_value(node->value);
+ node=(NodeInfo *) RelinquishMagickMemory(node);
UnlockSemaphoreInfo(splay_tree->semaphore);
return(key);
}
@@ -1298,8 +1266,7 @@ MagickExport void *RemoveNodeFromSplayTree(SplayTreeInfo *splay_tree,
compare;
NodeInfo
- *left,
- *right;
+ *node;
void
*value;
@@ -1324,27 +1291,12 @@ MagickExport void *RemoveNodeFromSplayTree(SplayTreeInfo *splay_tree,
UnlockSemaphoreInfo(splay_tree->semaphore);
return(value);
}
- left=splay_tree->root->left;
- right=splay_tree->root->right;
- value=splay_tree->root->value;
+ node=DetachRootFromSplayTree(splay_tree);
+ value=node->value;
if ((splay_tree->relinquish_key != (void *(*)(void *)) NULL) &&
- (splay_tree->root->key != (void *) NULL))
- splay_tree->root->key=splay_tree->relinquish_key(splay_tree->root->key);
- splay_tree->root=(NodeInfo *) RelinquishMagickMemory(splay_tree->root);
- splay_tree->nodes--;
- if (left == (NodeInfo *) NULL)
- {
- splay_tree->root=right;
- UnlockSemaphoreInfo(splay_tree->semaphore);
- return(value);
- }
- splay_tree->root=left;
- if (right != (NodeInfo *) NULL)
- {
- while (left->right != (NodeInfo *) NULL)
- left=left->right;
- left->right=right;
- }
+ (node->key != (void *) NULL))
+ node->key=splay_tree->relinquish_key(node->key);
+ node=(NodeInfo *) RelinquishMagickMemory(node);
UnlockSemaphoreInfo(splay_tree->semaphore);
return(value);
}