Den sön 4 apr. 2021 kl 12:28 skrev Daniel Stenberg <dan...@haxx.se>:
> On Sat, 3 Apr 2021, Henrik Holst wrote: > > (Let me just add some meat to this and explain this described behavior.) > > > As I wrote earlier, usually when you call curl_multi_add_handle(), the > Timer > > Function CB is called once by curl with timeout set to 0. Then when you > call > > curl_multi_socket_action() with CURL_SOCKET_TIMEOUT the Timer Function > CB is > > usually called once more but this time with a timeout set to 1. > > This description matches how libcurl *did* behave. More recent versions > don't > need to poll the name resolve results from the threaded resolver so the > timeout pattern will be slightly different. > On a side note (and perhaps I should have written this in a separate mail) I did notice that the timer function callback returns far too low values for long polling http servers if the user haven't set CURLOPT_TIMEOUT. Caveat here is that I have only tested this with 7.58 and 7.68 as of yet and not with HEAD. So one of the external services that I connect to uses long polling to avoid having people like me polling the service several times per second in order to get the latest update with minimal latency. Normally I set CURLOPT_TIMEOUT for all connections, but yesterday I experimented by using TCP Keep-alive instead so I commented out the setting of CURLOPT_TIMEOUT and noticed that the application took 100% cpu, later examination revealed that this was because the last timeout from the Timer Function callback was 1 (and sometimes 0). Here is one such run with CURLOPT_VERBOSE set, unfortunately the server is not public so replication might be hard: For this I simply print out the given timeout with this callback: static int CURL_timer_callback (__attribute__((unused)) CURLM *multi, long timeout, void *userp) { printf ("timeout: %ld\n", timeout); return 0; } timeout: -1 timeout: 0 timeout: 1 timeout: 1 timeout: 1 timeout: 4 timeout: 7 timeout: 1 timeout: 15 timeout: 1 timeout: 31 timeout: 1 * Trying xxx.170.239.163:80... * TCP_NODELAY set timeout: 49 * Connected to press.xxx.com (xxx.170.239.163) port 80 (#0) > GET /items&lastId=126599 HTTP/1.1 Host: press.xxx.com Accept: */* timeout: 119 timeout: 1 ^C* Closing connection 0 As you can see the last timeout given here was 1 and then about 10s later I hit ctrl-c to quit. I was rather expecting it to be -1 since the default timeout should be infinite. If I however set CURLOPT_TIMEOUT to say 1800L then: timeout: -1 timeout: 0 timeout: 1 timeout: 2 timeout: 3 timeout: 1 timeout: 8 timeout: 15 timeout: 1 timeout: 31 * Trying xxx.170.239.163:80... * TCP_NODELAY set timeout: 10 timeout: 1 timeout: 188 * Connected to press.xxx.com (xxx.170.239.163) port 80 (#0) > GET /items&lastId=126599 HTTP/1.1 Host: press.xxx.com Accept: */* timeout: 1799747 ^C* Closing connection 0 Here the timeout it set to the configured value of ~1800000ms /HH
------------------------------------------------------------------- Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library Etiquette: https://curl.se/mail/etiquette.html