From 6080143f9d4f198901792f1365123f9aad166446 Mon Sep 17 00:00:00 2001 From: Stefan Eissing Date: Thu, 10 Jul 2025 10:55:43 +0200 Subject: [PATCH] multi: replace remaining EXPIRE_RUN_NOW Remove EXPIRE_RUN_NOW completely. Replace the remaining use of EXPIRE_RUN_NOW with marking transfers as dirty. Closes #17883 --- lib/easy.c | 12 +++++++----- lib/multi.c | 32 +++++++++++++------------------- lib/urldata.h | 1 - tests/unit/unit2600.c | 4 ++-- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/lib/easy.c b/lib/easy.c index b751e1e436..440122a7d1 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -1161,13 +1161,15 @@ CURLcode curl_easy_pause(CURL *d, int action) /* If not completely pausing both directions now, run again in any case. */ if(!Curl_xfer_is_blocked(data)) { - Curl_expire(data, 0, EXPIRE_RUN_NOW); /* reset the too-slow time keeper */ data->state.keeps_speed.tv_sec = 0; - /* On changes, tell application to update its timers. */ - if(changed && data->multi) { - if(Curl_update_timer(data->multi) && !result) - result = CURLE_ABORTED_BY_CALLBACK; + if(data->multi) { + Curl_multi_mark_dirty(data); /* make it run */ + /* On changes, tell application to update its timers. */ + if(changed) { + if(Curl_update_timer(data->multi) && !result) + result = CURLE_ABORTED_BY_CALLBACK; + } } } diff --git a/lib/multi.c b/lib/multi.c index 37c7d0c9ef..62495030f1 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -465,22 +465,6 @@ CURLMcode curl_multi_add_handle(CURLM *m, CURL *d) is called. */ data->multi = multi; - /* Set the timeout for this handle to expire really soon so that it will - be taken care of even when this handle is added in the midst of operation - when only the curl_multi_socket() API is used. During that flow, only - sockets that time-out or have actions will be dealt with. Since this - handle has no action yet, we make sure it times out to get things to - happen. */ - Curl_expire(data, 0, EXPIRE_RUN_NOW); - - rc = Curl_update_timer(multi); - if(rc) { - data->multi = NULL; /* not anymore */ - Curl_uint_tbl_remove(&multi->xfers, data->mid); - data->mid = UINT_MAX; - return rc; - } - /* set the easy handle */ multistate(data, MSTATE_INIT); @@ -499,6 +483,18 @@ CURLMcode curl_multi_add_handle(CURLM *m, CURL *d) Curl_cpool_xfer_init(data); multi_warn_debug(multi, data); + /* Make sure the new handle will run */ + Curl_multi_mark_dirty(data); + /* Necessary in event based processing, where dirty handles trigger + * a timeout callback invocation. */ + rc = Curl_update_timer(multi); + if(rc) { + data->multi = NULL; /* not anymore */ + Curl_uint_tbl_remove(&multi->xfers, data->mid); + data->mid = UINT_MAX; + return rc; + } + /* The admin handle only ever has default timeouts set. To improve the state somewhat we clone the timeouts from each added handle so that the admin handle always has the same timeouts as the most recently added @@ -3632,9 +3628,7 @@ static void move_pending_to_connect(struct Curl_multi *multi, Curl_uint_bset_add(&multi->process, data->mid); multistate(data, MSTATE_CONNECT); - - /* Make sure that the handle will be processed soonish. */ - Curl_expire(data, 0, EXPIRE_RUN_NOW); + Curl_multi_mark_dirty(data); /* make it run */ } /* process_pending_handles() moves a handle from PENDING back into the process diff --git a/lib/urldata.h b/lib/urldata.h index e54721dd98..23f62b7002 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -966,7 +966,6 @@ typedef enum { EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */ EXPIRE_HAPPY_EYEBALLS, EXPIRE_MULTI_PENDING, - EXPIRE_RUN_NOW, EXPIRE_SPEEDCHECK, EXPIRE_TIMEOUT, EXPIRE_TOOFAST, diff --git a/tests/unit/unit2600.c b/tests/unit/unit2600.c index 21e575258b..0b664a003f 100644 --- a/tests/unit/unit2600.c +++ b/tests/unit/unit2600.c @@ -146,7 +146,7 @@ static CURLcode cf_test_connect(struct Curl_cfilter *cf, infof(data, "%04dms: cf[%s] continuing", (int)duration_ms, ctx->id); curlx_wait_ms(10); } - Curl_expire(data, ctx->fail_delay_ms - duration_ms, EXPIRE_RUN_NOW); + Curl_expire(data, ctx->fail_delay_ms - duration_ms, EXPIRE_TIMEOUT); return CURLE_OK; } @@ -224,7 +224,7 @@ static CURLcode cf_test_create(struct Curl_cfilter **pcf, if(result) goto out; - Curl_expire(data, ctx->fail_delay_ms, EXPIRE_RUN_NOW); + Curl_expire(data, ctx->fail_delay_ms, EXPIRE_TIMEOUT); out: *pcf = (!result) ? cf : NULL; -- 2.47.2