From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Glen Choo <chooglen@google.com>
Cc: git@vger.kernel.org, Calvin Wan <calvinwan@google.com>,
emilyshaffer@google.com, phillip.wood123@gmail.com,
myriamanis@google.com
Subject: Re: [PATCH v4 1/5] run-command: add duplicate_output_fn to run_processes_parallel_opts
Date: Wed, 30 Nov 2022 10:53:10 +0100 [thread overview]
Message-ID: <221130.86lensiwy0.gmgdl@evledraar.gmail.com> (raw)
In-Reply-To: <kl6lo7spqqzg.fsf@chooglen-macbookpro.roam.corp.google.com>
On Tue, Nov 29 2022, Glen Choo wrote:
> Calvin Wan <calvinwan@google.com> writes:
>
>> @@ -1680,8 +1683,14 @@ static void pp_buffer_stderr(struct parallel_processes *pp,
>> for (size_t i = 0; i < opts->processes; i++) {
>> if (pp->children[i].state == GIT_CP_WORKING &&
>> pp->pfd[i].revents & (POLLIN | POLLHUP)) {
>> - int n = strbuf_read_once(&pp->children[i].err,
>> - pp->children[i].process.err, 0);
>> + struct strbuf buf = STRBUF_INIT;
>> + int n = strbuf_read_once(&buf, pp->children[i].process.err, 0);
>> + strbuf_addbuf(&pp->children[i].err, &buf);
>> + if (opts->duplicate_output)
>> + opts->duplicate_output(&buf, &pp->children[i].err,
>> + opts->data,
>> + pp->children[i].data);
>> + strbuf_release(&buf);
>> if (n == 0) {
>> close(pp->children[i].process.err);
>> pp->children[i].state = GIT_CP_WAIT_CLEANUP;
>
> A common pattern is that optional behavior does not impose additional
> costs on the non-optional part. Here, we unconditionally do a
> strbuf_addbuf() even though we don't use the result in the "else" case.
>
> So this might be more idiomatically written as:
>
> int n = strbuf_read_once(&pp->children[i].err,
> pp->children[i].process.err, 0);
> + if (opts->duplicate_output) {
> + struct strbuf buf = STRBUF_INIT;
> + strbuf_addbuf(&buf, &pp->children[i].err);
> + opts->duplicate_output(&buf, &pp->children[i].err,
> + opts->data,
> + pp->children[i].data);
> + strbuf_release(&buf);
> + }
>
> which also has the nice benefit of not touching the strbuf_read_once()
> line.
We should also use "size_t n" there, not "int n", which is what it
returns. It won't matter for overflow in this case, but let's not
truncate for no good reason, it makes spotting actual overflows in
compiler output harder.
And why does "&buf" exist at all? Why can't we just pass
&pp->children[i].err, and if this callback cares about the last thing we
read let's pass it an offset, so it can know what came from the
strbuf_read_once() (I don't know if it actually cares about that
either...).
That would avoid the copy entirely.
next prev parent reply other threads:[~2022-11-30 10:00 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <https://lore.kernel.org/git/20221020232532.1128326-1-calvinwan@google.com/>
2022-11-08 18:41 ` [PATCH v4 0/5] submodule: parallelize diff Calvin Wan
2022-11-23 17:49 ` Glen Choo
2023-01-15 9:31 ` Junio C Hamano
2023-01-17 19:31 ` Calvin Wan
2022-11-08 18:41 ` [PATCH v4 1/5] run-command: add duplicate_output_fn to run_processes_parallel_opts Calvin Wan
2022-11-28 20:45 ` Jonathan Tan
2022-11-30 18:46 ` Calvin Wan
2022-11-29 5:11 ` Elijah Newren
2022-11-30 18:47 ` Calvin Wan
2022-11-29 23:29 ` Glen Choo
2022-11-30 9:53 ` Ævar Arnfjörð Bjarmason [this message]
2022-11-30 10:26 ` Phillip Wood
2022-11-30 19:02 ` Calvin Wan
2022-11-30 10:28 ` Phillip Wood
2022-11-30 10:57 ` Ævar Arnfjörð Bjarmason
2022-11-08 18:41 ` [PATCH v4 2/5] submodule: strbuf variable rename Calvin Wan
2022-11-08 18:41 ` [PATCH v4 3/5] submodule: move status parsing into function Calvin Wan
2022-11-08 18:41 ` [PATCH v4 4/5] diff-lib: refactor match_stat_with_submodule Calvin Wan
2022-11-30 14:36 ` Phillip Wood
2022-11-30 19:08 ` Calvin Wan
2022-11-08 18:42 ` [PATCH v4 5/5] diff-lib: parallelize run_diff_files for submodules Calvin Wan
2022-11-28 21:01 ` Jonathan Tan
2022-11-29 22:29 ` Glen Choo
2022-11-30 18:11 ` Calvin Wan
2022-11-29 5:13 ` Elijah Newren
2022-11-30 18:04 ` Calvin Wan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=221130.86lensiwy0.gmgdl@evledraar.gmail.com \
--to=avarab@gmail.com \
--cc=calvinwan@google.com \
--cc=chooglen@google.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=myriamanis@google.com \
--cc=phillip.wood123@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).