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

Re: [PATCH 02/15] read-cache: Improve readability

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 22, 2015, 19:26 UTC
Message-ID
<xmqq619sdeb9.fsf@gitster.dls.corp.google.com>
In-Reply-To
<CAGZ79kaLJgC6rWdRSeVVQSBYn0soJuzqnrK_bNtgAPWimPYE8w@mail.gmail.com>
Stefan Beller <sbeller@google.com> writes:
> Maybe I have read too much of the refs code lately as there we
> have these long chains which combine precondition with error
> checking.
Of course, things are not so black-and-white in the real world.  
You can also take an extreme stance and view
	if (!pretend && do_it_and_report_error())
        	error(...);

differently. I would explain that what the whole thing is trying to achieve as "'do it' part is the primary thing we want to do, but it only can be done when we are not pretending, and we show an error when the 'do it' part fails." and would suggest structuring it more like this:

	if (pretend)
        	; /* nothing */
	else if (do_it_and_report_error())
        	error(...);
or
	if (!pretend) {
        	if (do_it_and_report_error())
                	error(...);
	}

But you could say "The final objective of the whole thing is to show an error message, but if we are pretending or if our attempt to 'do it' succeeds, we do not have to show the error", and such a view may make sense depending on what that 'do it' is. The original may be justified under such an interpretation.

We may be tempted to write (note: each boolean term may be a call with many complex arguments)

    if (A && B && C && D && E)
	...
when it is in fact logically is more like this:
    /* does not make sense to attempt C when A && B does not hold */
    if (A && B) {
    	if (C && D && E)
        	...
    }

But it becomes a judgement call if splitting that into nested two if statements is better for overall readability when the top-level if statement has an else clause. You cannot turn it into

    /* does not make sense to attempt C when A && B does not hold */
    if (A && B) {
    	if (C && D && E)
        	...
    } else {
        ... /* this cannot be what the original's else clause did */
    }

blindly. It would need further restructuring. I think the code inside the refs.c is a result of making such judgement calls.

Show 6 quoted lines
>> By the way, aren't we leaking ce when we are merely pretending?
>
> Yes we are, that's how I found this spot. (coverity pointed out ce was
> leaking, so I was refactoring to actually make it easier to fix it, and then
> heavily reordered the patch series afterwards. That spot was forgotten
> apparently.

I dropped 2/15 and expect the real fix in the future; no rush, though.

Previous: Stefan BellerNext: Stefan Beller
Message 12 of 44 in “Fixing memory leaks”
  1. 00/15 Fixing memory leaksStefan Beller, Mar 21, 2015
  2. 01/15 read-cache: fix memleakStefan Beller, Mar 21, 2015
  3. Junio C HamanoMar 21, 2015
  4. Stefan BellerMar 23, 2015
  5. 1/2 read-cache: fix memleakStefan Beller, Mar 23, 2015
  6. 2/2 read-cache.c: fix a memleak in add_to_indexStefan Beller, Mar 23, 2015
  7. Junio C HamanoMar 23, 2015
  8. Junio C HamanoMar 23, 2015
  9. 02/15 read-cache: Improve readabilityStefan Beller, Mar 21, 2015
  10. Junio C HamanoMar 21, 2015
  11. Stefan BellerMar 21, 2015
  12. Junio C HamanoMar 22, 2015
  13. 03/15 read-cache: free cache entry in add_to_index in case of early returnStefan Beller, Mar 21, 2015
  14. Junio C HamanoMar 21, 2015
  15. Stefan BellerMar 21, 2015
  16. Junio C HamanoMar 22, 2015
  17. 04/15 update-index: fix a memleakStefan Beller, Mar 21, 2015
  18. Junio C HamanoMar 21, 2015
  19. update-index: Don't copy memory aroundStefan Beller, Mar 23, 2015
  20. Junio C HamanoMar 23, 2015
  21. 05/15 builtin/apply.c: fix a memleakStefan Beller, Mar 21, 2015
  22. Junio C HamanoMar 21, 2015
  23. builtin/apply.c: fix a memleak (Fixup, squashable)Stefan Beller, Mar 23, 2015
  24. Junio C HamanoMar 23, 2015
  25. 06/15 merge-blobs.c: Fix a memleakStefan Beller, Mar 21, 2015
  26. 07/15 merge-recursive: fix memleaksStefan Beller, Mar 21, 2015
  27. Junio C HamanoMar 21, 2015
  28. 08/15 http-push: Remove unneeded cleanupStefan Beller, Mar 21, 2015
  29. 09/15 http: release the memory of a http pack request as wellStefan Beller, Mar 21, 2015
  30. Junio C HamanoMar 22, 2015
  31. Stefan BellerMar 24, 2015
  32. Junio C HamanoMar 24, 2015
  33. 10/15 commit.c: fix a memory leakStefan Beller, Mar 21, 2015
  34. Junio C HamanoMar 21, 2015
  35. Duy NguyenMar 24, 2015
  36. Re* [PATCH 10/15] commit.c: fix a memory leakJunio C Hamano, Mar 24, 2015
  37. Stefan BellerMar 24, 2015
  38. 11/15 builtin/check-attr: fix a memleakStefan Beller, Mar 21, 2015
  39. Junio C HamanoMar 21, 2015
  40. 12/15 builtin/merge-base: fix memleakStefan Beller, Mar 21, 2015
  41. 13/15 builtin/unpack-file: fix a memleakStefan Beller, Mar 21, 2015
  42. 14/15 builtin/cat-file: free memleakStefan Beller, Mar 21, 2015
  43. 15/15 ls-files: fix a memleakStefan Beller, Mar 21, 2015
  44. Junio C HamanoMar 21, 2015

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.