From: Daniel Stenberg Date: Sun, 12 Mar 2023 22:55:09 +0000 (+0100) Subject: multi: make multi_perform ignore/unignore signals less often X-Git-Tag: curl-8_0_0~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc90308328afb8;p=thirdparty%2Fcurl.git multi: make multi_perform ignore/unignore signals less often For improved performance Reported-by: Jerome St-Louis Ref: #10743 Closes #10750 --- diff --git a/lib/multi.c b/lib/multi.c index 3bf72ce655..6e272cb665 100644 --- a/lib/multi.c +++ b/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); - - if(result) - returncode = result; - - data = data->next; /* operate on next handle */ } /* diff --git a/lib/sigpipe.h b/lib/sigpipe.h index 14ab25b67c..48761ad0fd 100644 --- a/lib/sigpipe.h +++ b/lib/sigpipe.h @@ -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 */