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
23
lib/multi.c
23
lib/multi.c
@ -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 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user