Re: [PATCH 2/2] [GSOC] ref-filter: reuse output buffer
- From
ZheNing Hu <adlternative@gmail.com>
- Date
- Apr 20, 2021, 06:05 UTC
- Message-ID
- <CAOLTT8SDv6bFOdqu6f_=QWPrQtbyFp_XYFkdRmONg4tJ7C=fAA@mail.gmail.com>
- In-Reply-To
- <xmqq7dky9ear.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> 于2021年4月20日周二 上午5:04写道:
Show 45 quoted lines
>
> "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > diff --git a/builtin/branch.c b/builtin/branch.c
> > index bcc00bcf182d..00081de1aed8 100644
> > --- a/builtin/branch.c
> > +++ b/builtin/branch.c
> > @@ -411,6 +411,8 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
> > {
> > int i;
> > struct ref_array array;
> > + struct strbuf out = STRBUF_INIT;
> > + struct strbuf err = STRBUF_INIT;
> > int maxwidth = 0;
> > const char *remote_prefix = "";
> > char *to_free = NULL;
> > @@ -440,8 +442,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
> > ref_array_sort(sorting, &array);
> >
> > for (i = 0; i < array.nr; i++) {
> > - struct strbuf out = STRBUF_INIT;
> > - struct strbuf err = STRBUF_INIT;
> > + strbuf_reset(&out);
> > if (format_ref_array_item(array.items[i], format, &out, &err))
> > die("%s", err.buf);
>
> This change relies on the fact that format_ref_array_item() will
> never touch error when it returns 0 (success); otherwise, we'd end
> up accumulating err from multiple calls to it in the loop until it
> returns non-zero (failure), at which point we emit a single "fatal:"
> prefix to show multiple error messages. Which leans me ...
>
> > @@ -452,10 +453,10 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
> > fwrite(out.buf, 1, out.len, stdout);
> > putchar('\n');
> > }
> > - strbuf_release(&err);
> > - strbuf_release(&out);
> > }
> >
> > + strbuf_release(&err);
> > + strbuf_release(&out);
>
> ... to suspect that the _release() of err will always be a no-op.
>Yes, it's a no-op to _release(&err) In the present situation.
Show 13 quoted lines
> It may be easier to follow if err is _reset() always where out is > _reset(), from code cleanliness's perspective. Then nobody has to > wonder why we do not reset err inside loop even though we release > at the end. > > It also is OK to document more clearly that we assume that the loop > will not exit without calling die() when err is not empty. If we > take that route, we may want to drop _release(&err) at the end. > > I do not know which of the two is better, but the code presented > which is halfway between these two does not quite look easy to > reason about. >
René Scharfe mention that it make leaks checking harder if we without releasing this err. So on balance, adding err's _reset() in the loop seems like a viable option. The change in performance will also be minimal too.
Even though we're using _release() in the loop in v1, and then Peff think that we don't need to _release() err, but code cleanness wasn't a concern at the time.
So I'll add _reset() to the loop in the next iteration.
> Thanks. >
Thanks. -- ZheNing Hu