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

Re: Why do we have both x*() and *_or_die() for "do or die"?

From
Stefan Beller <sbeller@google.com>
Date
May 22, 2018, 18:04 UTC
Message-ID
<CAGZ79kZs7aNXB2cn8p+m5gUOAv0OqhPW6b23y4cbm9d3Njwn=A@mail.gmail.com>
In-Reply-To
<874liz8tsi.fsf@evledraar.gmail.com>

On Tue, May 22, 2018 at 10:49 AM, Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 5 quoted lines
>
> On Wed, May 16 2018, Stefan Beller wrote:
>
>> A common pattern with the repo_read_index function is to die if the return
>> of repo_read_index is negative.  Move this pattern into a function.

This was done organically, i.e. taking the smallest available step that yields a better code base. There was definitely no stepping back or looking at the big picture involved.

> Just a side-question unrelated to this patch per-se, why do we have both
> x*() and *_or_die() functions in the codebase?

Digging into the history, the x*() emerges from 112db553b0d (Shrink the git binary a bit by avoiding unnecessary inline functions, 2008-06-22) and is wrapping common patterns to reduce the size of the binary.

The or_die pattern comes from 7230e6d042a (Add write_or_die(), a helper function, 2006-08-21). This was motivated as better code ("making additional error handling unnecessary", "replace two similar ones")

None of them really hint at the _die() as a problem in the libification efforts which came later IIUC.

> I can't find any pattern
> for one or the other, e.g. we have both xopen() and then write_or_die(),

hah! Up to now I assumed the x* is system calls with write_or_die as an exception. There is also a xwrite and write_in_full, so they are slightly different in the way that xwrite covers only the system call and copes with some common error patterns, whereas write_or_die uses write_in_full which itself uses xwrite.

> so it's not a matter of x*() just being for syscalls and *_or_die()
> being for our own functions (also as e.g. strbuf uses x*(), not
> *_or_die()).

I would tend to argue that way: x* are strictly to system calls (no die() in there), and the _die() functions are "hands off *no* error handling needed"

> I'm not trying to litigate the difference and understand it could have
> just emerged organically. I'm just wondering if that's the full story or
> if one is preferred, or we prefer one or the other in some
> circumstances.

I think we'd prefer the x() for lib code and the _or_die code in builtin/ due to the nature of effort needed to get it right.

Thanks, Stefan

Previous: Jonathan NiederNext: Junio C Hamano
Message 29 of 38 in “grep: handle corrupt index files early”
  1. grep: handle corrupt index files earlyStefan Beller, May 15, 2018
  2. Johannes SchindelinMay 15, 2018
  3. Duy NguyenMay 15, 2018
  4. Stefan BellerMay 15, 2018
  5. Duy NguyenMay 16, 2018
  6. 00/11 Stefan Beller, May 16, 2018
  7. 01/11 grep: handle corrupt index files earlyStefan Beller, May 16, 2018
  8. 06/11 read_cache: use repo_read_index_or_die with different error messagesStefan Beller, May 16, 2018
  9. 09/11 checkout-index: switch to repo_read_indexStefan Beller, May 16, 2018
  10. 05/11 builtin/ls-files: use repo_read_index_or_dieStefan Beller, May 16, 2018
  11. 07/11 rerere: use repo_read_index_or_dieStefan Beller, May 16, 2018
  12. Thomas GummererMay 20, 2018
  13. Stefan BellerMay 21, 2018
  14. 11/11 read_cache: convert most calls to repo_read_index_or_dieStefan Beller, May 16, 2018
  15. Brandon WilliamsMay 16, 2018
  16. Duy NguyenMay 19, 2018
  17. Duy NguyenMay 19, 2018
  18. 08/11 check-attr: switch to repo_read_index_or_dieStefan Beller, May 16, 2018
  19. 10/11 test helpers: switch to repo_read_index_or_dieStefan Beller, May 16, 2018
  20. 02/11 repository: introduce repo_read_index_or_dieStefan Beller, May 16, 2018
  21. Duy NguyenMay 19, 2018
  22. Stefan BellerMay 21, 2018
  23. Brandon WilliamsMay 21, 2018
  24. Stefan BellerMay 21, 2018
  25. Duy NguyenMay 22, 2018
  26. Why do we have both x*() and *_or_die() for "do or die"?Ævar Arnfjörð Bjarmason, May 22, 2018
  27. Duy NguyenMay 22, 2018
  28. Jonathan NiederMay 22, 2018
  29. Stefan BellerMay 22, 2018
  30. Junio C HamanoMay 23, 2018
  31. 03/11 builtin/grep: use repo_read_index_or_dieStefan Beller, May 16, 2018
  32. 04/11 submodule: use repo_read_index_or_dieStefan Beller, May 16, 2018
  33. Duy NguyenMay 19, 2018
  34. Junio C HamanoMay 17, 2018
  35. Stefan BellerMay 17, 2018
  36. Junio C HamanoMay 17, 2018
  37. Brandon WilliamsMay 15, 2018
  38. Junio C HamanoMay 15, 2018

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.