From bc90308328afb8e1b99de2d518b1427516288c12 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 12 Mar 2023 23:55:09 +0100 Subject: [PATCH] multi: make multi_perform ignore/unignore signals less often For improved performance Reported-by: Jerome St-Louis Ref: #10743 Closes #10750 --- lib/multi.c | 23 +++++++++++++++-------- lib/sigpipe.h | 1 - 2 files changed, 15 insertions(+), 9 deletions(-) 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 */ -- 2.47.3