Git Mailing List Archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Calvin Wan <calvinwan@google.com>
Cc: Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>,
	git@vger.kernel.org, Elijah Newren <newren@gmail.com>
Subject: Re: [PATCH 23/24] hash-ll, hashmap: move oidhash() to hash-ll
Date: Thu, 11 May 2023 14:31:43 -0400	[thread overview]
Message-ID: <20230511183143.GA1978320@coredump.intra.peff.net> (raw)
In-Reply-To: <20230511172401.934633-1-calvinwan@google.com>

On Thu, May 11, 2023 at 05:24:01PM +0000, Calvin Wan wrote:

> > Note that there's a small but
> > important change to khash.h in this patch as well to allow this move,
> > which is easy to overlook.
> 
> Can you go into a bit more detail as to how this change allows the move?
> (An example of the concatenation would probably be sufficient)

Even after finding the hunk, I have to admit I scratched my head at what
was going on.

The answer is that object-store-ll.h now uses "struct kh_odb_path_map"
instead of a typedef'd kh_odb_path_map. Using the typedef is the way
that the khash library intends to work (and the only way it provides),
but does not match our usual Git style. In other users of the khash
library, we just bend to their will and use the typedef typedef (which
we have to, because it does not even name the struct type directly!).

But we can't do that here, because object-store-ll.h does not include
khash.h, so must forward declare the struct (actually, we do not even do
that, but it is legal to just refer to it as a pointer). But the
compiler only understands what we are doing if the "struct" keyword is
present.

So I think the solution here is reasonable, but I actually think it
would make sense to pull it out into its own patch, with a rationale
like:

  khash.h lets you instantiate custom hash types that map between two
  types. These are defined as a struct, as you might expect, and khash
  typedef's that to kh_foo_t. But it declares the struct anonymously,
  which doesn't give a name to the struct type itself; there is no
  "struct kh_foo". This has two small downsides:

    - when using khash, we declare "kh_foo_t *the_foo".  This is
      unlike our usual naming style, which is "struct kh_foo *the_foo".

    - you can't forward-declare a typedef of an unnamed struct type in
      C. So we might do something like this in a header file:

         struct kh_foo;
         struct bar {
                 struct kh_foo *the_foo;
	 };

      to avoid having to include the header that defines the real
      kh_foo. But that doesn't work with the typedef'd name. Without the
      "struct" keyword, the compiler doesn't know we mean that kh_foo is
      a type.

   So let's always give khash structs the name that matches our
   conventions ("struct kh_foo" to match "kh_foo_t"). We'll keep doing
   the typedef to retain compatibility with existing callers.

The "you can't do this in C" is all off the top of my head. I think it's
correct, but there may be a clever way to do it that I don't know of.
Though even there is, I think "make khash more like our usual
conventions" is a good thing by itself.

-Peff

  reply	other threads:[~2023-05-11 18:31 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-07  3:45 [PATCH 00/24] Header cleanups (final splitting of cache.h, and some splitting of other headers) Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 01/24] init-db: remove unnecessary global variable & document existing bug Elijah Newren via GitGitGadget
2023-05-11 17:24   ` Calvin Wan
2023-05-12  1:55     ` Elijah Newren
2023-05-11 20:43   ` Glen Choo
2023-05-12  1:21     ` Elijah Newren
2023-05-12 17:26       ` Glen Choo
2023-05-07  3:45 ` [PATCH 02/24] init-db, clone: change unnecessary global into passed parameter Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 03/24] setup: adopt shared init-db & clone code Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 04/24] read-cache: move shared commit and ls-files code Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 05/24] add: modify add_files_to_cache() to avoid globals Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 06/24] read-cache: move shared add/checkout/commit code Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 07/24] statinfo: move stat_{data,validity} functions from cache/read-cache Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 08/24] run-command.h: move declarations for run-command.c from cache.h Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 09/24] name-hash.h: move declarations for name-hash.c " Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 10/24] sparse-index.h: move declarations for sparse-index.c " Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 11/24] preload-index.h: move declarations for preload-index.c from elsewhere Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 12/24] diff.h: move declaration for global in diff.c from cache.h Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 13/24] merge.h: move declarations for merge.c " Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 14/24] repository.h: move declaration of the_index " Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 15/24] read-cache*.h: move declarations for read-cache.c functions " Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 16/24] cache.h: remove this no-longer-used header Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 17/24] log-tree: replace include of revision.h with simple forward declaration Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 18/24] repository: remove unnecessary include of path.h Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 19/24] diff.h: remove unnecessary include of oidset.h Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 20/24] list-objects-filter-options.h: remove unneccessary include Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 21/24] builtin.h: remove unneccessary includes Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 22/24] git-compat-util.h: remove unneccessary include of wildmatch.h Elijah Newren via GitGitGadget
2023-05-07  3:45 ` [PATCH 23/24] hash-ll, hashmap: move oidhash() to hash-ll Elijah Newren via GitGitGadget
2023-05-11 17:24   ` Calvin Wan
2023-05-11 18:31     ` Jeff King [this message]
2023-05-11 18:39       ` Felipe Contreras
2023-05-12  2:08       ` Elijah Newren
2023-05-12  4:07         ` Jeff King
2023-05-07  3:45 ` [PATCH 24/24] fsmonitor-ll.h: split this header out of fsmonitor.h Elijah Newren via GitGitGadget
2023-05-08 15:29 ` [PATCH 00/24] Header cleanups (final splitting of cache.h, and some splitting of other headers) Junio C Hamano
2023-05-09  1:31   ` Elijah Newren
2023-05-09 16:03     ` Junio C Hamano
2023-05-08 15:55 ` Junio C Hamano
2023-05-11 17:41 ` Calvin Wan
2023-05-12  6:58   ` Elijah Newren
2023-05-12  7:04 ` [PATCH v2 00/27] " Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 01/27] init-db: document existing bug with core.bare in template config Elijah Newren via GitGitGadget
2023-05-12 21:34     ` Jonathan Tan
2023-05-16  3:08       ` Elijah Newren
2023-05-12  7:04   ` [PATCH v2 02/27] init-db: remove unnecessary global variable Elijah Newren via GitGitGadget
2023-05-12 20:20     ` Glen Choo
2023-05-12  7:04   ` [PATCH v2 03/27] init-db, clone: change unnecessary global into passed parameter Elijah Newren via GitGitGadget
2023-05-12 21:28     ` Jonathan Tan
2023-05-16  2:57       ` Elijah Newren
2023-05-12  7:04   ` [PATCH v2 04/27] setup: adopt shared init-db & clone code Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 05/27] read-cache: move shared commit and ls-files code Elijah Newren via GitGitGadget
2023-05-12 21:25     ` Jonathan Tan
2023-05-12  7:04   ` [PATCH v2 06/27] add: modify add_files_to_cache() to avoid globals Elijah Newren via GitGitGadget
2023-05-15 21:44     ` Jonathan Tan
2023-05-12  7:04   ` [PATCH v2 07/27] read-cache: move shared add/checkout/commit code Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 08/27] statinfo: move stat_{data,validity} functions from cache/read-cache Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 09/27] run-command.h: move declarations for run-command.c from cache.h Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 10/27] name-hash.h: move declarations for name-hash.c " Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 11/27] sparse-index.h: move declarations for sparse-index.c " Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 12/27] preload-index.h: move declarations for preload-index.c from elsewhere Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 13/27] diff.h: move declaration for global in diff.c from cache.h Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 14/27] merge.h: move declarations for merge.c " Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 15/27] repository.h: move declaration of the_index " Elijah Newren via GitGitGadget
2023-05-15 21:50     ` Jonathan Tan
2023-05-12  7:04   ` [PATCH v2 16/27] read-cache*.h: move declarations for read-cache.c functions " Elijah Newren via GitGitGadget
2023-05-16  0:00     ` Jonathan Tan
2023-05-12  7:04   ` [PATCH v2 17/27] cache.h: remove this no-longer-used header Elijah Newren via GitGitGadget
2023-05-16  0:02     ` Jonathan Tan
2023-05-16  3:02       ` Elijah Newren
2023-05-12  7:04   ` [PATCH v2 18/27] log-tree: replace include of revision.h with simple forward declaration Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 19/27] repository: remove unnecessary include of path.h Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 20/27] diff.h: remove unnecessary include of oidset.h Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 21/27] list-objects-filter-options.h: remove unneccessary include Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 22/27] builtin.h: remove unneccessary includes Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 23/27] git-compat-util.h: remove unneccessary include of wildmatch.h Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 24/27] merge-ll: rename from ll-merge Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 25/27] khash: name the structs that khash declares Elijah Newren via GitGitGadget
2023-05-12  7:04   ` [PATCH v2 26/27] hash-ll, hashmap: move oidhash() to hash-ll Elijah Newren via GitGitGadget
2023-05-16  0:16     ` Jonathan Tan
2023-05-16  3:06       ` Elijah Newren
2023-05-12  7:04   ` [PATCH v2 27/27] fsmonitor-ll.h: split this header out of fsmonitor.h Elijah Newren via GitGitGadget
2023-05-16  0:17     ` Jonathan Tan
2023-05-16  3:07       ` Elijah Newren
2023-05-16  6:33   ` [PATCH v3 00/28] Header cleanups (final splitting of cache.h, and some splitting of other headers) Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 01/28] init-db: document existing bug with core.bare in template config Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 02/28] init-db: remove unnecessary global variable Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 03/28] init-db, clone: change unnecessary global into passed parameter Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 04/28] setup: adopt shared init-db & clone code Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 05/28] read-cache: move shared commit and ls-files code Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 06/28] add: modify add_files_to_cache() to avoid globals Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 07/28] read-cache: move shared add/checkout/commit code Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 08/28] statinfo: move stat_{data,validity} functions from cache/read-cache Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 09/28] run-command.h: move declarations for run-command.c from cache.h Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 10/28] name-hash.h: move declarations for name-hash.c " Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 11/28] sparse-index.h: move declarations for sparse-index.c " Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 12/28] preload-index.h: move declarations for preload-index.c from elsewhere Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 13/28] diff.h: move declaration for global in diff.c from cache.h Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 14/28] merge.h: move declarations for merge.c " Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 15/28] repository.h: move declaration of the_index " Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 16/28] read-cache*.h: move declarations for read-cache.c functions " Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 17/28] cache.h: remove this no-longer-used header Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 18/28] log-tree: replace include of revision.h with simple forward declaration Elijah Newren via GitGitGadget
2023-05-16  6:33     ` [PATCH v3 19/28] repository: remove unnecessary include of path.h Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 20/28] diff.h: remove unnecessary include of oidset.h Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 21/28] list-objects-filter-options.h: remove unneccessary include Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 22/28] builtin.h: remove unneccessary includes Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 23/28] git-compat-util.h: remove unneccessary include of wildmatch.h Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 24/28] merge-ll: rename from ll-merge Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 25/28] khash: name the structs that khash declares Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 26/28] object-store-ll.h: split this header out of object-store.h Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 27/28] hash-ll, hashmap: move oidhash() to hash-ll Elijah Newren via GitGitGadget
2023-05-16  6:34     ` [PATCH v3 28/28] fsmonitor-ll.h: split this header out of fsmonitor.h Elijah Newren via GitGitGadget
2023-05-23 19:49     ` [PATCH v3 00/28] Header cleanups (final splitting of cache.h, and some splitting of other headers) Calvin Wan
2023-05-24  0:11       ` Elijah Newren

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=20230511183143.GA1978320@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=calvinwan@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=newren@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 read-only IMAP folder(s) and NNTP newsgroup(s).