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

Re: [PATCH 2/3] setup: have the_repository use the_index

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 12, 2017, 20:38 UTC
Message-ID
<xmqqmv891jct.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20170712180143.GD65927@google.com>
Brandon Williams <bmwill@google.com> writes:
> For all intents and purposes the index struct that is stored in 'struct
> repository' is an embedded instance, its just stored as a pointer
> instead of being a direct part of the struct itself.

The question really is this. In order to realize the intents and purposes to have an embeded instance, the most natural way to implement it is to actually embed an instance. There must be some advantage of substituting that most natural implementation with a pointer that needs to point at a separately allocated memory; otherwise the implementation chosen is a poor imitation of the real thing. One downside of not actually embedding an instance is that the code needs to do something different from what it has always done to answer "is the index already populated?". In the normal codepath, it would look at istate.initialized but for the index state that is emulatedly-embedded in the repository, it would also have to see if the pointer is NULL.

And I do not see why a pointer to an allocated struct was chosen, and what advantage we wanted to extract from that design decision.

Show 5 quoted lines
> As far as
> submodules are concerned, thats why 'repo_read_index' exists since it
> will allocate the index struct if needed and then populate it with the
> index file associated with that repository.  So the 'struct repository'
> owns that instance of 'struct index_state'.

All of the above merely makes an excuse why you can work around the fact that the index field is a pointer. It does not say why it is better not to embed the real thing at all.

> Since it is a pointer then using a '#define' to replace 'the_index'
> (which is not a pointer) would be a little more challenging.

The above is merely realizing another downside that stems from the earlier design decision that the index field is not a real embedded structure, but is a pointer. It does not explain why it is better to have a pointer to an allocated structure in the first place.

I am not (yet) telling you to fix the design to have a pointer "index" by replacing it with an embedded structure. I may actually do so later, but I am first trying to find out if it is a right design decision with some advantage. If there is some advantage to have it as a pointer to an allocated structure, then perhaps we may even want to do the conversion the other way by declaring the_index is always a pointer to an allocated structure that _could_ be NULL. We can even lose the istate.initialized bit if we did so, as the way to answer "is the index already populated?" in the new world order would be to see if it is NULL.

But if there isn't any advantage, then I _would_ tell you that the design to have it as a pointer in the repository structure _is_ a mistake. But I do not think I was given sufficient information to decide it yet.

Thanks.
Previous: Brandon WilliamsNext: Jonathan Nieder
Message 13 of 68 in “Convert grep to recurse in-process”
  1. 0/3 Convert grep to recurse in-processBrandon Williams, Jul 11, 2017
  2. 1/3 repo_read_index: don't discard the indexBrandon Williams, Jul 11, 2017
  3. Jonathan NiederJul 11, 2017
  4. Brandon WilliamsJul 12, 2017
  5. Stefan BellerJul 11, 2017
  6. Brandon WilliamsJul 12, 2017
  7. 2/3 setup: have the_repository use the_indexBrandon Williams, Jul 11, 2017
  8. Jonathan NiederJul 12, 2017
  9. Stefan BellerJul 12, 2017
  10. Brandon WilliamsJul 12, 2017
  11. Junio C HamanoJul 12, 2017
  12. Brandon WilliamsJul 12, 2017
  13. Junio C HamanoJul 12, 2017
  14. Jonathan NiederJul 12, 2017
  15. Junio C HamanoJul 12, 2017
  16. Junio C HamanoJul 18, 2017
  17. 3/3 grep: recurse in-process using 'struct repository'Brandon Williams, Jul 11, 2017
  18. Jacob KellerJul 11, 2017
  19. Brandon WilliamsJul 12, 2017
  20. Stefan BellerJul 12, 2017
  21. Brandon WilliamsJul 12, 2017
  22. Jonathan NiederJul 12, 2017
  23. Brandon WilliamsJul 12, 2017
  24. Jeff KingJul 12, 2017
  25. Brandon WilliamsJul 12, 2017
  26. Jeff KingJul 12, 2017
  27. Jonathan NiederJul 12, 2017
  28. Jeff KingJul 12, 2017
  29. Jonathan NiederJul 12, 2017
  30. Stefan BellerJul 12, 2017
  31. Jeff KingJul 12, 2017
  32. 0/3 Convert grep to recurse in-processBrandon Williams, Jul 14, 2017
  33. 1/3 repo_read_index: don't discard the indexBrandon Williams, Jul 14, 2017
  34. 2/3 repository: have the_repository use the_indexBrandon Williams, Jul 14, 2017
  35. 3/3 grep: recurse in-process using 'struct repository'Brandon Williams, Jul 14, 2017
  36. 00/10 Convert grep to recurse in-processBrandon Williams, Jul 18, 2017
  37. 01/10 repo_read_index: don't discard the indexBrandon Williams, Jul 18, 2017
  38. 02/10 repository: have the_repository use the_indexBrandon Williams, Jul 18, 2017
  39. 04/10 config: add config_from_gitmodulesBrandon Williams, Jul 18, 2017
  40. 03/10 cache.h: add GITMODULES_FILE macroBrandon Williams, Jul 18, 2017
  41. convert any hard coded .gitmodules file string to the MACROStefan Beller, Jul 31, 2017
  42. Jeff HostetlerAug 1, 2017
  43. Stefan BellerAug 1, 2017
  44. Junio C HamanoAug 1, 2017
  45. Brandon WilliamsAug 2, 2017
  46. Brandon WilliamsAug 2, 2017
  47. 08/10 submodule: check for unmerged .gitmodules outside of config parsingBrandon Williams, Jul 18, 2017
  48. 09/10 submodule: merge repo_read_gitmodules and gitmodules_configBrandon Williams, Jul 18, 2017
  49. 10/10 grep: recurse in-process using 'struct repository'Brandon Williams, Jul 18, 2017
  50. 05/10 submodule: remove submodule.fetchjobs from submodule-config parsingBrandon Williams, Jul 18, 2017
  51. 06/10 submodule: remove fetch.recursesubmodules from submodule-config parsingBrandon Williams, Jul 18, 2017
  52. 07/10 submodule: check for unstaged .gitmodules outside of config parsingBrandon Williams, Jul 18, 2017
  53. Stefan BellerJul 31, 2017
  54. Brandon WilliamsAug 2, 2017
  55. Brandon WilliamsAug 2, 2017
  56. Junio C HamanoJul 18, 2017
  57. Brandon WilliamsJul 18, 2017
  58. 00/10 Convert grep to recurse in-processBrandon Williams, Aug 2, 2017
  59. 01/10 repo_read_index: don't discard the indexBrandon Williams, Aug 2, 2017
  60. 02/10 repository: have the_repository use the_indexBrandon Williams, Aug 2, 2017
  61. 04/10 config: add config_from_gitmodulesBrandon Williams, Aug 2, 2017
  62. 06/10 submodule: remove fetch.recursesubmodules from submodule-config parsingBrandon Williams, Aug 2, 2017
  63. 03/10 cache.h: add GITMODULES_FILE macroBrandon Williams, Aug 2, 2017
  64. 08/10 submodule: check for unmerged .gitmodules outside of config parsingBrandon Williams, Aug 2, 2017
  65. 09/10 submodule: merge repo_read_gitmodules and gitmodules_configBrandon Williams, Aug 2, 2017
  66. 10/10 grep: recurse in-process using 'struct repository'Brandon Williams, Aug 2, 2017
  67. 05/10 submodule: remove submodule.fetchjobs from submodule-config parsingBrandon Williams, Aug 2, 2017
  68. 07/10 submodule: check for unstaged .gitmodules outside of config parsingBrandon Williams, Aug 2, 2017

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.