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

Re: [PATCH v8 18/19] branch: use ref-filter printing APIs

From
Jeff King <peff@peff.net>
Date
Dec 12, 2016, 16:40 UTC
Message-ID
<20161212164020.btrrg2f62haxt7sh@sigill.intra.peff.net>
In-Reply-To
<CAOLa=ZT1KN_iw7JzB78hPb-LrY_yaDZk0D+TqY2W9hCOftzumA@mail.gmail.com>
On Mon, Dec 12, 2016 at 09:59:49PM +0530, Karthik Nayak wrote:
Show 19 quoted lines
> >> > This caller never stores the return value, and it ends up leaking. So I
> >> > wonder if you wanted "static struct strbuf" in the first place (and that
> >> > would explain the strbuf_reset() in your function).
> >>
> >> Ah! Yes this should be 'static struct strbuf' indeed, I blindly copied Junio's
> >> suggestion.
> >>
> >> strbuf_detach() is also a better way to go.
> >
> > One of the other, though. If it's static, then you _don't_ want to
> > detach.
> >
> 
> Wait. Why not? since it gets added to the strbuf's within
> build_format() and that
> value is not needed again, why do we need to re-allocate? we can use the same
> variable again (i.e by keeping it as static).
> 
> I'm sorry, but I didn't get why these two should be mutually exclusive?

What is the memory ownership convention for the return value from the function?

If the caller should own the memory, then you want to do this:
  char *foo(...)
  {
	struct strbuf buf = STRBUF_INIT;
	... fill up buf ...
	return strbuf_detach(&buf, NULL);
  }

The "detach" disconnects the memory from the strbuf (which is going out of scope anyway), and the only pointer left to it is in the caller. It's important to use "detach" here and not just return the pointer, because that ensures that the returned value is always allocated memory (and never strbuf_slopbuf).

If the caller should not own the memory, then the function retains ownership. And you want something like this:

  char *foo(...)
  {
	static struct strbuf buf = STRBUF_INIT;
	strbuf_reset(&buf);
	... fill up buf ...
	return buf.buf;
  }

The same buffer is reused over and over. The "reset" call clears any leftover bits from the last invocation, and you must _not_ call strbuf_detach() in the return, as it disconnects the memory from the strbuf (and so next time you'd end up allocating again, and each return value becomes a memory leak).

Does that make sense?
-Peff
Previous: Karthik NayakNext: Karthik Nayak
Message 14 of 32 in “port branch.c to use ref-filter's printing options”
  1. 00/19 port branch.c to use ref-filter's printing optionsKarthik Nayak, Dec 7, 2016
  2. 02/19 ref-filter: include reference to 'used_atom' within 'atom_value'Karthik Nayak, Dec 7, 2016
  3. 15/19 ref-filter: add an 'rstrip=<N>' option to atoms which deal with refnamesKarthik Nayak, Dec 7, 2016
  4. 08/19 ref-filter: add support for %(upstream:track,nobracket)Karthik Nayak, Dec 7, 2016
  5. 09/19 ref-filter: make "%(symref)" atom work with the ':short' modifierKarthik Nayak, Dec 7, 2016
  6. 10/19 ref-filter: introduce refname_atom_parser_internal()Karthik Nayak, Dec 7, 2016
  7. 16/19 ref-filter: allow porcelain to translate messages in the outputKarthik Nayak, Dec 7, 2016
  8. 19/19 branch: implement '--format' optionKarthik Nayak, Dec 7, 2016
  9. 18/19 branch: use ref-filter printing APIsKarthik Nayak, Dec 7, 2016
  10. Jeff KingDec 9, 2016
  11. Karthik NayakDec 12, 2016
  12. Jeff KingDec 12, 2016
  13. Karthik NayakDec 12, 2016
  14. Jeff KingDec 12, 2016
  15. Karthik NayakDec 12, 2016
  16. 14/19 ref-filter: modify the 'lstrip=<N>' option to work with negative '<N>'Karthik Nayak, Dec 7, 2016
  17. 13/19 ref-filter: rename the 'strip' option to 'lstrip'Karthik Nayak, Dec 7, 2016
  18. 17/19 branch, tag: use porcelain outputKarthik Nayak, Dec 7, 2016
  19. 11/19 ref-filter: introduce refname_atom_parser()Karthik Nayak, Dec 7, 2016
  20. 12/19 ref-filter: make remote_ref_atom_parser() use refname_atom_parser_internal()Karthik Nayak, Dec 7, 2016
  21. 07/19 ref-filter: make %(upstream:track) prints "[gone]" for invalid upstreamsKarthik Nayak, Dec 7, 2016
  22. 04/19 ref-filter: modify "%(objectname:short)" to take lengthKarthik Nayak, Dec 7, 2016
  23. 05/19 ref-filter: move get_head_description() from branch.cKarthik Nayak, Dec 7, 2016
  24. 06/19 ref-filter: introduce format_ref_array_item()Karthik Nayak, Dec 7, 2016
  25. 03/19 ref-filter: implement %(if:equals=<string>) and %(if:notequals=<string>)Karthik Nayak, Dec 7, 2016
  26. 01/19 ref-filter: implement %(if), %(then), and %(else) atomsKarthik Nayak, Dec 7, 2016
  27. Jacob KellerDec 8, 2016
  28. Junio C HamanoDec 8, 2016
  29. Jacob KellerDec 9, 2016
  30. Karthik NayakDec 12, 2016
  31. Junio C HamanoDec 8, 2016
  32. Karthik NayakDec 12, 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.