multi: fix multi_wait() timeout handling
- determine the actual poll timeout *after* all sockets have been collected. Protocols and connection filters may install new timeouts during collection. - add debug logging to test1533 where the mistake was noticed Reported-by: Matt Jolly Fixes #13782 Closes #13825
This commit is contained in:
parent
3b9569c3e2
commit
c8096668ae
15
lib/multi.c
15
lib/multi.c
@ -1366,13 +1366,6 @@ static CURLMcode multi_wait(struct Curl_multi *multi,
|
||||
if(timeout_ms < 0)
|
||||
return CURLM_BAD_FUNCTION_ARGUMENT;
|
||||
|
||||
/* If the internally desired timeout is actually shorter than requested from
|
||||
the outside, then use the shorter time! But only if the internal timer
|
||||
is actually larger than -1! */
|
||||
(void)multi_timeout(multi, &timeout_internal);
|
||||
if((timeout_internal >= 0) && (timeout_internal < (long)timeout_ms))
|
||||
timeout_ms = (int)timeout_internal;
|
||||
|
||||
memset(ufds, 0, ufds_len * sizeof(struct pollfd));
|
||||
memset(&ps, 0, sizeof(ps));
|
||||
|
||||
@ -1476,6 +1469,14 @@ static CURLMcode multi_wait(struct Curl_multi *multi,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* We check the internal timeout *AFTER* we collected all sockets to
|
||||
* poll. Collecting the sockets may install new timers by protocols
|
||||
* and connection filters.
|
||||
* Use the shorter one of the internal and the caller requested timeout. */
|
||||
(void)multi_timeout(multi, &timeout_internal);
|
||||
if((timeout_internal >= 0) && (timeout_internal < (long)timeout_ms))
|
||||
timeout_ms = (int)timeout_internal;
|
||||
|
||||
#if defined(ENABLE_WAKEUP) && defined(USE_WINSOCK)
|
||||
if(nfds || use_wakeup) {
|
||||
#else
|
||||
|
||||
@ -487,7 +487,7 @@ lib1551_SOURCES = lib1551.c $(SUPPORTFILES)
|
||||
lib1552_SOURCES = lib1552.c $(SUPPORTFILES) $(TESTUTIL)
|
||||
lib1552_LDADD = $(TESTUTIL_LIBS)
|
||||
|
||||
lib1553_SOURCES = lib1553.c $(SUPPORTFILES) $(TESTUTIL)
|
||||
lib1553_SOURCES = lib1553.c $(SUPPORTFILES) $(TSTTRACE) $(TESTUTIL)
|
||||
lib1553_LDADD = $(TESTUTIL_LIBS)
|
||||
|
||||
lib1554_SOURCES = lib1554.c $(SUPPORTFILES)
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
#include "test.h"
|
||||
|
||||
#include "testutil.h"
|
||||
#include "testtrace.h"
|
||||
#include "warnless.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
@ -74,6 +75,12 @@ CURLcode test(char *URL)
|
||||
easy_setopt(curls, CURLOPT_XFERINFOFUNCTION, xferinfo);
|
||||
easy_setopt(curls, CURLOPT_NOPROGRESS, 1L);
|
||||
|
||||
libtest_debug_config.nohex = 1;
|
||||
libtest_debug_config.tracetime = 1;
|
||||
test_setopt(curls, CURLOPT_DEBUGDATA, &libtest_debug_config);
|
||||
easy_setopt(curls, CURLOPT_DEBUGFUNCTION, libtest_debug_cb);
|
||||
easy_setopt(curls, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
multi_add_handle(multi, curls);
|
||||
|
||||
multi_perform(multi, &still_running);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user