diff options
author | Dániel Bakai <daniel.bakai@tresorit.com> | 2017-03-24 09:43:27 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-04-04 23:37:18 +0200 |
commit | de05bcb706243546d37047439dabc4e73054cfef (patch) | |
tree | f5ac11182e6389c8ba6fb8f34b093b64a25f7479 /tests/unit | |
parent | d40f4e15e73f906cd06919da84e535f52637c1a1 (diff) |
multi: fix queueing of pending easy handles
Multi handles repeatedly invert the queue of pending easy handles when
used with CURLMOPT_MAX_TOTAL_CONNECTIONS. This is caused by a multistep
process involving Curl_splaygetbest and violates the FIFO property of
the multi handle.
This patch fixes this issue by redefining the "best" node in the
context of timeouts as the "smallest not larger than now", and
implementing the necessary data structure modifications to do this
effectively, namely:
- splay nodes with the same key are now stored in a doubly-linked
circular list instead of a non-circular one to enable O(1)
insertion to the tail of the list
- Curl_splayinsert inserts nodes with the same key to the tail of
the same list
- in case of multiple nodes with the same key, the one on the head of
the list gets selected
Diffstat (limited to 'tests/unit')
-rw-r--r-- | tests/unit/unit1309.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/tests/unit/unit1309.c b/tests/unit/unit1309.c index 3cf6eefbd..b75b1d74b 100644 --- a/tests/unit/unit1309.c +++ b/tests/unit/unit1309.c @@ -52,7 +52,7 @@ static void splayprint(struct Curl_tree * t, int d, char output) (long)t->key.tv_usec, i); } - for(count=0, node = t->same; node; node = node->same, count++) + for(count=0, node = t->samen; node != t; node = node->samen, count++) ; if(output) { |