mirror of
https://github.com/curl/curl.git
synced 2024-11-21 01:16:58 +08:00
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:
parent
9f96537cc3
commit
bc90308328
17
lib/multi.c
17
lib/multi.c
@ -2706,18 +2706,25 @@ CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
|
||||
return CURLM_RECURSIVE_API_CALL;
|
||||
|
||||
data = multi->easyp;
|
||||
while(data) {
|
||||
if(data) {
|
||||
CURLMcode result;
|
||||
bool nosig = data->set.no_signal;
|
||||
SIGPIPE_VARIABLE(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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -50,7 +50,6 @@ static void sigpipe_ignore(struct Curl_easy *data,
|
||||
if(!data->set.no_signal) {
|
||||
struct sigaction action;
|
||||
/* first, extract the existing situation */
|
||||
memset(&ig->old_pipe_act, 0, sizeof(struct sigaction));
|
||||
sigaction(SIGPIPE, NULL, &ig->old_pipe_act);
|
||||
action = ig->old_pipe_act;
|
||||
/* ignore this signal */
|
||||
|
Loading…
Reference in New Issue
Block a user