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

Re: [[PATCH v2] 1/4] patch-ids: stop using a hand-rolled hashmap implementation

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Aug 1, 2016, 08:54 UTC
Message-ID
<alpine.DEB.2.20.1607301056120.11824@virtualbox>
In-Reply-To
<xmqqoa5gmas6.fsf@gitster.mtv.corp.google.com>
Hi Junio,

first of all: Kevin & I are colleagues and I helped prepare this patch series. I had the idea to have a two-level patch ID to help e.g. when an alternate object store is hosted on a (slow) network drive.

On Fri, 29 Jul 2016, Junio C Hamano wrote:
Show 18 quoted lines
> Kevin Willford <kcwillford@gmail.com> writes:
> 
> >  struct patch_id *add_commit_patch_id(struct commit *commit,
> >  				     struct patch_ids *ids)
> >  {
> > -	return add_commit(commit, ids, 0);
> > +	struct patch_id *key = xcalloc(1, sizeof(*key));
> > +
> > +	if (init_patch_id_entry(key, commit, ids)) {
> > +		free(key);
> > +		return NULL;
> > +	}
> 
> This is a tangent, but this made me wonder if it is safe to simply
> free(3) the result of calling hashmap_entry_init() which is called
> in init_patch_id_entry().  It would obviously become a resource
> leak, if a hashmap_entry (which the api documentation says is "an
> opaque structure") holds any allocated resource.

It would be a serious bug if hashmap_entry_init() played games with references, given its signature (that this function does not have any access to the hashmap structure, only to the entry itself):

	void hashmap_entry_init(void *entry, unsigned int hash)

Please note that the `void *entry` really needs to point to a struct whose first field is of type `struct hashmap_entry`. This is not type-safe, of course, but C does not allow a strong sub-typing of the kind we want to use here.

Show 12 quoted lines
> The fact that hashmap_entry_init() is there but there is no
> corresponding hashmap_entry_clear() hints that there is nothing to
> be worried about and I can see from the implementation of
> hashmap_entry_init() that no extra resource is held inside, but an
> API user should not have to guess.  We may want to do one of the two
> things:
> 
>  * document that an embedded hashmap_entry does not hold any
>    resource that need to be released and it is safe to free the user
>    structure that embeds one; or
> 
>  * implement hashmap_entry_clear() that currently is a no-op.

Urgh. The only reason we have hashmap_entry_init() is that we *may* want to extend `struct hashmap_entry` at some point. That is *already* over-engineered because that point in time seems quite unlikely to arrive, like, ever.

In that light, as you said, why would we overengineer things even further by introducing a hashmap_entry_clear(), especially given that we won't catch any forgotten _clear() calls, given that it is a no-op anyway?

Let's just not.

Ciao, Dscho

Previous: Junio C HamanoNext: Junio C Hamano
Message 4 of 25 in “0/4] Use header data patch ids for rebase to avoid loading file content”
  1. 0/4] Use header data patch ids for rebase to avoid loading file contentKevin Willford, Jul 29, 2016
  2. 1/4] patch-ids: stop using a hand-rolled hashmap implementationKevin Willford, Jul 29, 2016
  3. Junio C HamanoJul 29, 2016
  4. Johannes SchindelinAug 1, 2016
  5. Junio C HamanoAug 1, 2016
  6. Eric WongAug 1, 2016
  7. Johannes SchindelinAug 2, 2016
  8. Junio C HamanoAug 2, 2016
  9. Junio C HamanoAug 2, 2016
  10. Junio C HamanoJul 29, 2016
  11. 2/4] patch-ids: replace the seen indicator with a commit pointerKevin Willford, Jul 29, 2016
  12. Junio C HamanoJul 29, 2016
  13. 4/4] rebase: avoid computing unnecessary patch IDsKevin Willford, Jul 29, 2016
  14. Junio C HamanoJul 29, 2016
  15. Johannes SchindelinAug 1, 2016
  16. Junio C HamanoAug 1, 2016
  17. Jakub NarębskiAug 2, 2016
  18. Junio C HamanoAug 2, 2016
  19. Johannes SchindelinAug 2, 2016
  20. Junio C HamanoAug 2, 2016
  21. Junio C HamanoAug 4, 2016
  22. Johannes SchindelinAug 4, 2016
  23. 3/4] patch-ids: add flag to create the diff patch id using header only dataKevin Willford, Jul 29, 2016
  24. Junio C HamanoJul 29, 2016
  25. Johannes SchindelinAug 1, 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.