diff --git a/lib/easy.c b/lib/easy.c index 9c1f1c6969..3804b79608 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -1154,13 +1154,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 fe2cca4039..66c11b02cd 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 @@ -3631,9 +3627,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 63bee65dc9..808dda346b 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -963,7 +963,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/lib/vquic/curl_msh3.c b/lib/vquic/curl_msh3.c index 2f0c9de848..4691924f3c 100644 --- a/lib/vquic/curl_msh3.c +++ b/lib/vquic/curl_msh3.c @@ -742,7 +742,7 @@ static CURLcode h3_data_pause(struct Curl_cfilter *cf, { if(!pause) { h3_drain_stream(cf, data); - Curl_expire(data, 0, EXPIRE_RUN_NOW); + Curl_multi_mark_dirty(data); } return CURLE_OK; } 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;