git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v8 7/8] cache: add empty_tree_oid object

From
Jeff King <peff@peff.net>
Date
Aug 19, 2016, 20:58 UTC
Message-ID
<20160819205806.vxzzgphqf4lgdor7@sigill.intra.peff.net>
In-Reply-To
<xmqqfuq01oww.fsf@gitster.mtv.corp.google.com>
On Fri, Aug 19, 2016 at 01:31:27PM -0700, Junio C Hamano wrote:
Show 15 quoted lines
> Jacob Keller <jacob.e.keller@intel.com> writes:
> 
> > From: Jacob Keller <jacob.keller@gmail.com>
> >
> > Add an empty_tree_oid object which can be used in place of
> > EMPTY_TREE_SHA1_BIN_LITERAL for code which is being converted to struct
> > object_id.
> 
> How widely do you envision the users of this symbol would be spread
> across the entire codebase?  I am debating myself if we need a
> singleton in-core copy like this (if we end up referring to it from
> everywhere), or we only need one level higher abstraction,
> e.g. "is_empty_tree_oid()" helper (in which case I do not think we
> even need a singleton; just imitate how is_empty_blob_sha1() is
> implemented).

I suspect we need more than just the "is_empty" query. At least for the blob case, we do hashcpy() it into a struct (which should eventually become oidcpy). The empty-tree case even more so, as we pass it to random functions like lookup_tree().

Our EMPTY_TREE_SHA1_BIN_LITERAL effectively ends up as a singleton in-core, too; it's just handled transparently by the compiler, since it's a literal. This effectively gives us _two_ singletons. We could do:

  const struct object_id empty_blob_oid = {
	  "\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b"
	  "\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91"
  };
  #define EMPTY_BLOB_SHA1_BIN (empty_blob_oid.hash)

It's possible the use of an actual string literal lets the compiler do more optimizations, but I'd doubt it matters in practice. Probably it is just sticking that literal somewhere in BSS and filling in the pointer to it.

-Peff
Previous: Jacob KellerNext: Junio C Hamano
Message 15 of 28 in “submodule show inline diff”
  1. 0/8 submodule show inline diffJacob Keller, Aug 19, 2016
  2. 6/8 submodule: refactor show_submodule_summary with helper functionJacob Keller, Aug 19, 2016
  3. Junio C HamanoAug 19, 2016
  4. Jacob KellerAug 19, 2016
  5. 1/8 diff.c: remove output_prefix_length fieldJacob Keller, Aug 19, 2016
  6. 3/8 diff: prepare for additional submodule formatsJacob Keller, Aug 19, 2016
  7. Junio C HamanoAug 19, 2016
  8. 2/8 graph: add support for --line-prefix on all graph-aware outputJacob Keller, Aug 19, 2016
  9. 7/8 cache: add empty_tree_oid objectJacob Keller, Aug 19, 2016
  10. Junio C HamanoAug 19, 2016
  11. Jacob KellerAug 19, 2016
  12. Junio C HamanoAug 19, 2016
  13. Junio C HamanoAug 19, 2016
  14. Jacob KellerAug 19, 2016
  15. Jeff KingAug 19, 2016
  16. Junio C HamanoAug 23, 2016
  17. 5/8 submodule: convert show_submodule_summary to use struct object_id *Jacob Keller, Aug 19, 2016
  18. Junio C HamanoAug 19, 2016
  19. 8/8 diff: teach diff to display submodule difference with an inline diffJacob Keller, Aug 19, 2016
  20. Junio C HamanoAug 19, 2016
  21. Jacob KellerAug 19, 2016
  22. 4/8 submodule: allow add_submodule_odb to work even if path is not checked outJacob Keller, Aug 19, 2016
  23. Junio C HamanoAug 19, 2016
  24. Jacob KellerAug 19, 2016
  25. Junio C HamanoAug 19, 2016
  26. Jacob KellerAug 19, 2016
  27. Junio C HamanoAug 19, 2016
  28. Jacob KellerAug 19, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.