From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Patrick Steinhardt <ps@pks.im>,
"brian m. carlson" <sandals@crustytoothpaste.net>
Subject: Re: [PATCH 4/7] hash: make git_hash_discard() idempotent
Date: Tue, 7 Jul 2026 16:18:08 -0400 [thread overview]
Message-ID: <20260707201808.GD11780@coredump.intra.peff.net> (raw)
In-Reply-To: <xmqqqzle7osz.fsf@gitster.g>
On Tue, Jul 07, 2026 at 09:22:04AM -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
>
> > You must always either finalize or discard a hash context to release any
> > resources, but you must call only one such function. This creates extra
> > work for some callers, since their cleanup code paths need to know
> > whether they got there via their happy path (and the finalization
> > happened) or due to an error (in which case they need to discard).
> >
> > Let's add an "active" flag that turns a redundant discard into a noop.
> > That lets you safely do this:
> >
> > git_hash_init(&ctx, algo);
> > ...
> > if (some_error)
> > goto out;
> > ...
> > git_hash_final(result, &ctx);
> >
> > out:
> > git_hash_discard(&ctx);
> >
> > This should avoid future errors, and will also let us simplify a few
> > existing callers (in future patches).
>
> Hmph, so is the point of this change to allow _discard() to be
> called even after _final() was already called that we do not need an
> early return or something before the out: label?
Right. Maybe fleshing out this example was not a good idea, as yeah, you
could fix it with an early return. If there were more cleanup in the
"out" label it would be harder. In practice neither of the spots we're
able to clean up look exactly like this. They are split across multiple
functions. So maybe:
/* foo contains a git_hash_ctx and initializes it here */
foo_init(&foo);
if (some_error)
foo_release(&foo);
git_hash_final(&foo.ctx);
foo_release(&foo);
would be more realistic. The problem is that foo_release() doesn't know
if the hash was finalized or not.
> Unlike commit_*() and rollback_*() used in lockfile API, where the
> names clearly say which one is for happy and which one is for error
> case, the _final() and _discard() pair does not exactly tell me
> which is which, but I guess I will get used to it, perhaps.
Hmm, I had hoped that "discard" versus just "release" would communicate
that. "final" is a bit funny, but that is the long-standing name for
that hash operation (both in our code and in libraries).
> But the change nevertheless looks mostly good except for one "hmph".
> When _init() is called, active gets turned on automatically, and
> either _discard() or _final() turns it off. Only _discard() is
> protected from getting called multiple times. Is this because
> it is already a no-op to call _final() multiple times?
No, it's a bug to call _final() multiple times. See my response
elsewhere in the thread.
-Peff
next prev parent reply other threads:[~2026-07-07 20:18 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-07 4:55 [PATCH 0/7] git_hash_*() quality-of-life improvements Jeff King
2026-07-07 5:01 ` [PATCH 1/7] hash: use git_hash_init() consistently Jeff King
2026-07-07 14:39 ` Junio C Hamano
2026-07-07 20:13 ` Jeff King
2026-07-07 20:17 ` Junio C Hamano
2026-07-07 20:25 ` Jeff King
2026-07-07 21:25 ` brian m. carlson
2026-07-08 3:54 ` Jeff King
2026-07-07 5:04 ` [PATCH 2/7] hash: convert remaining direct function calls Jeff King
2026-07-07 16:15 ` Junio C Hamano
2026-07-07 5:05 ` [PATCH 3/7] hash: document function pointers and wrappers Jeff King
2026-07-07 14:26 ` Patrick Steinhardt
2026-07-07 20:05 ` Jeff King
2026-07-07 5:07 ` [PATCH 4/7] hash: make git_hash_discard() idempotent Jeff King
2026-07-07 16:22 ` Junio C Hamano
2026-07-07 20:18 ` Jeff King [this message]
2026-07-07 21:41 ` brian m. carlson
2026-07-07 22:25 ` Junio C Hamano
2026-07-07 5:07 ` [PATCH 5/7] csum-file: use idempotent git_hash_discard() Jeff King
2026-07-07 5:08 ` [PATCH 6/7] http: " Jeff King
2026-07-07 16:25 ` Junio C Hamano
2026-07-07 5:09 ` [PATCH 7/7] hash: check ctx->active flag in all wrapper functions Jeff King
2026-07-07 14:26 ` Patrick Steinhardt
2026-07-07 16:33 ` Junio C Hamano
2026-07-07 20:10 ` Jeff King
2026-07-07 14:26 ` [PATCH 0/7] git_hash_*() quality-of-life improvements Patrick Steinhardt
2026-07-08 3:52 ` [PATCH v2 " Jeff King
2026-07-08 3:52 ` [PATCH v2 1/7] hash: use git_hash_init() consistently Jeff King
2026-07-08 3:52 ` [PATCH v2 2/7] hash: convert remaining direct function calls Jeff King
2026-07-08 3:52 ` [PATCH v2 3/7] hash: document function pointers and wrappers Jeff King
2026-07-08 3:52 ` [PATCH v2 4/7] hash: make git_hash_discard() idempotent Jeff King
2026-07-08 3:53 ` [PATCH v2 5/7] csum-file: use idempotent git_hash_discard() Jeff King
2026-07-08 3:53 ` [PATCH v2 6/7] http: " Jeff King
2026-07-08 3:53 ` [PATCH v2 7/7] hash: check ctx->active flag in all wrapper functions Jeff King
2026-07-08 8:05 ` [PATCH v2 0/7] git_hash_*() quality-of-life improvements Patrick Steinhardt
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=20260707201808.GD11780@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=ps@pks.im \
--cc=sandals@crustytoothpaste.net \
/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