aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/curl/lib/splay.c
diff options
context:
space:
mode:
authorMaxim Yurchuk <maxim-yurchuk@ydb.tech>2024-10-04 17:24:16 +0300
committerGitHub <noreply@github.com>2024-10-04 17:24:16 +0300
commita1e4766748b5924d3879ab6a0259b28ec3c5d535 (patch)
tree4480150864228623d6c9101a4ba8c049bda9aa90 /contrib/libs/curl/lib/splay.c
parent6536467764bed7822214815ce92ed4dcd5bf409b (diff)
parenta46fe128b9c9c84438fc2aac337aeefdaecb99df (diff)
downloadydb-a1e4766748b5924d3879ab6a0259b28ec3c5d535.tar.gz
Merge pull request #10090 from ydb-platform/mergelibs-241004-1110
Library import 241004-1110
Diffstat (limited to 'contrib/libs/curl/lib/splay.c')
-rw-r--r--contrib/libs/curl/lib/splay.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/contrib/libs/curl/lib/splay.c b/contrib/libs/curl/lib/splay.c
index 48e079b32a..5e27b08a6c 100644
--- a/contrib/libs/curl/lib/splay.c
+++ b/contrib/libs/curl/lib/splay.c
@@ -24,6 +24,7 @@
#include "curl_setup.h"
+#include "timeval.h"
#include "splay.h"
/*
@@ -33,7 +34,7 @@
* zero : when i is equal to j
* positive when : when i is larger than j
*/
-#define compare(i,j) Curl_splaycomparekeys((i),(j))
+#define compare(i,j) Curl_timediff_us(i,j)
/*
* Splay using the key i (which may or may not be in the tree.) The starting
@@ -45,12 +46,12 @@ struct Curl_tree *Curl_splay(struct curltime i,
struct Curl_tree N, *l, *r, *y;
if(!t)
- return t;
+ return NULL;
N.smaller = N.larger = NULL;
l = r = &N;
for(;;) {
- long comp = compare(i, t->key);
+ timediff_t comp = compare(i, t->key);
if(comp < 0) {
if(!t->smaller)
break;
@@ -93,7 +94,7 @@ struct Curl_tree *Curl_splay(struct curltime i,
return t;
}
-/* Insert key i into the tree t. Return a pointer to the resulting tree or
+/* Insert key i into the tree t. Return a pointer to the resulting tree or
* NULL if something went wrong.
*
* @unittest: 1309
@@ -106,11 +107,11 @@ struct Curl_tree *Curl_splayinsert(struct curltime i,
~0, -1
}; /* will *NEVER* appear */
- if(!node)
- return t;
+ DEBUGASSERT(node);
if(t) {
t = Curl_splay(i, t);
+ DEBUGASSERT(t);
if(compare(i, t->key) == 0) {
/* There already exists a node in the tree with the very same key. Build
a doubly-linked circular list of nodes. We add the new 'node' struct
@@ -150,7 +151,7 @@ struct Curl_tree *Curl_splayinsert(struct curltime i,
}
/* Finds and deletes the best-fit node from the tree. Return a pointer to the
- resulting tree. best-fit means the smallest node if it is not larger than
+ resulting tree. best-fit means the smallest node if it is not larger than
the key */
struct Curl_tree *Curl_splaygetbest(struct curltime i,
struct Curl_tree *t,
@@ -166,6 +167,7 @@ struct Curl_tree *Curl_splaygetbest(struct curltime i,
/* find smallest */
t = Curl_splay(tv_zero, t);
+ DEBUGASSERT(t);
if(compare(i, t->key) < 0) {
/* even the smallest is too big */
*removed = NULL;
@@ -197,13 +199,13 @@ struct Curl_tree *Curl_splaygetbest(struct curltime i,
}
-/* Deletes the very node we point out from the tree if it's there. Stores a
+/* Deletes the very node we point out from the tree if it is there. Stores a
* pointer to the new resulting tree in 'newroot'.
*
* Returns zero on success and non-zero on errors!
* When returning error, it does not touch the 'newroot' pointer.
*
- * NOTE: when the last node of the tree is removed, there's no tree left so
+ * NOTE: when the last node of the tree is removed, there is no tree left so
* 'newroot' will be made to point to NULL.
*
* @unittest: 1309
@@ -217,9 +219,11 @@ int Curl_splayremove(struct Curl_tree *t,
}; /* will *NEVER* appear */
struct Curl_tree *x;
- if(!t || !removenode)
+ if(!t)
return 1;
+ DEBUGASSERT(removenode);
+
if(compare(KEY_NOTUSED, removenode->key) == 0) {
/* Key set to NOTUSED means it is a subnode within a 'same' linked list
and thus we can unlink it easily. */
@@ -238,10 +242,11 @@ int Curl_splayremove(struct Curl_tree *t,
}
t = Curl_splay(removenode->key, t);
+ DEBUGASSERT(t);
/* First make sure that we got the same root node as the one we want
to remove, as otherwise we might be trying to remove a node that
- isn't actually in the tree.
+ is not actually in the tree.
We cannot just compare the keys here as a double remove in quick
succession of a node with key != KEY_NOTUSED && same != NULL
@@ -249,7 +254,7 @@ int Curl_splayremove(struct Curl_tree *t,
if(t != removenode)
return 2;
- /* Check if there is a list with identical sizes, as then we're trying to
+ /* Check if there is a list with identical sizes, as then we are trying to
remove the root node of a list of nodes with identical keys. */
x = t->samen;
if(x != t) {
@@ -268,6 +273,7 @@ int Curl_splayremove(struct Curl_tree *t,
x = t->larger;
else {
x = Curl_splay(removenode->key, t->smaller);
+ DEBUGASSERT(x);
x->larger = t->larger;
}
}
@@ -276,3 +282,16 @@ int Curl_splayremove(struct Curl_tree *t,
return 0;
}
+
+/* set and get the custom payload for this tree node */
+void Curl_splayset(struct Curl_tree *node, void *payload)
+{
+ DEBUGASSERT(node);
+ node->ptr = payload;
+}
+
+void *Curl_splayget(struct Curl_tree *node)
+{
+ DEBUGASSERT(node);
+ return node->ptr;
+}