multi: make multi_perform ignore/unignore signals less often

For improved performance

Reported-by: Jerome St-Louis
Ref: #10743
Closes #10750
This commit is contained in:
Daniel Stenberg 2023-03-12 23:55:09 +01:00
parent 9f96537cc3
commit bc90308328
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
2 changed files with 15 additions and 9 deletions

View File

@ -2706,18 +2706,25 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
return CURLM_RECURSIVE_API_CALL; return CURLM_RECURSIVE_API_CALL;
data = multi->easyp; data = multi->easyp;
while(data) { if(data) {
CURLMcode result; CURLMcode result;
bool nosig = data->set.no_signal;
SIGPIPE_VARIABLE(pipe_st); SIGPIPE_VARIABLE(pipe_st);
sigpipe_ignore(data, &pipe_st); sigpipe_ignore(data, &pipe_st);
result = multi_runsingle(multi, &now, data); /* Do the loop and only alter the signal ignore state if the next handle
has a different NO_SIGNAL state than the previous */
do {
if(data->set.no_signal != nosig) {
sigpipe_restore(&pipe_st);
sigpipe_ignore(data, &pipe_st);
nosig = data->set.no_signal;
}
result = multi_runsingle(multi, &now, data);
if(result)
returncode = result;
data = data->next; /* operate on next handle */
} while(data);
sigpipe_restore(&pipe_st); sigpipe_restore(&pipe_st);
if(result)
returncode = result;
data = data->next; /* operate on next handle */
} }
/* /*

View File

@ -50,7 +50,6 @@ static void sigpipe_ignore(struct Curl_easy *data,
if(!data->set.no_signal) { if(!data->set.no_signal) {
struct sigaction action; struct sigaction action;
/* first, extract the existing situation */ /* first, extract the existing situation */
memset(&ig->old_pipe_act, 0, sizeof(struct sigaction));
sigaction(SIGPIPE, NULL, &ig->old_pipe_act); sigaction(SIGPIPE, NULL, &ig->old_pipe_act);
action = ig->old_pipe_act; action = ig->old_pipe_act;
/* ignore this signal */ /* ignore this signal */