mirror of
https://github.com/curl/curl.git
synced 2026-08-26 10:33:33 +03:00
transfer: do not use EXPIRE_NOW while blocked
- When a transfer sets `data->state.select_bits`, it is scheduled for rerun with EXPIRE_NOW. If such a transfer is blocked (due to PAUSE, for example), this will lead to a busy loop. - multi.c: check for transfer block - sendf.*: add Curl_xfer_is_blocked() - sendf.*: add client reader `is_paused()` callback - implement is_paused()` callback where needed Closes #13908
This commit is contained in:
parent
1424d507aa
commit
3841569ec8
10 changed files with 86 additions and 2 deletions
|
|
@ -218,6 +218,7 @@ struct Curl_crtype {
|
|||
struct Curl_creader *reader, curl_off_t offset);
|
||||
CURLcode (*rewind)(struct Curl_easy *data, struct Curl_creader *reader);
|
||||
CURLcode (*unpause)(struct Curl_easy *data, struct Curl_creader *reader);
|
||||
bool (*is_paused)(struct Curl_easy *data, struct Curl_creader *reader);
|
||||
void (*done)(struct Curl_easy *data,
|
||||
struct Curl_creader *reader, int premature);
|
||||
size_t creader_size; /* sizeof() allocated struct Curl_creader */
|
||||
|
|
@ -268,6 +269,8 @@ CURLcode Curl_creader_def_rewind(struct Curl_easy *data,
|
|||
struct Curl_creader *reader);
|
||||
CURLcode Curl_creader_def_unpause(struct Curl_easy *data,
|
||||
struct Curl_creader *reader);
|
||||
bool Curl_creader_def_is_paused(struct Curl_easy *data,
|
||||
struct Curl_creader *reader);
|
||||
void Curl_creader_def_done(struct Curl_easy *data,
|
||||
struct Curl_creader *reader, int premature);
|
||||
|
||||
|
|
@ -375,6 +378,11 @@ CURLcode Curl_creader_resume_from(struct Curl_easy *data, curl_off_t offset);
|
|||
*/
|
||||
CURLcode Curl_creader_unpause(struct Curl_easy *data);
|
||||
|
||||
/**
|
||||
* Return TRUE iff any of the installed readers is paused.
|
||||
*/
|
||||
bool Curl_creader_is_paused(struct Curl_easy *data);
|
||||
|
||||
/**
|
||||
* Tell all client readers that they are done.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue