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

[PATCH 07/21] trailer: simplify 'arg_item' lifetime

From
Anders Waldenborg <anders@0x63.nu>
Date
Oct 25, 2020, 21:26 UTC
Message-ID
<20201025212652.3003036-8-anders@0x63.nu>
In-Reply-To
<20201025212652.3003036-1-anders@0x63.nu>
); SAEximRunCond expanded to false

'struct arg_item' are created from config and '--trailers' arguments in 'git interpret-trailers'.

Then they were freed as they were processed. This made it harder to reason about and ensure that all of them were properly freed in all cases.

This commit extends the lifetime by not doing any freeing during processing but rather freeing the whole list afterwards. This make it clearer and will allow keeping a reference to the config stored in the arg item.

The drawback is that there is extra memory allocation as previously the strings could be donated to the trailer_item when that is created. Now they have to be copied.

No functional change intended.
Signed-off-by: Anders Waldenborg <anders@0x63.nu>
---
 trailer.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/trailer.c b/trailer.c
index 227df1c0ef..047781463a 100644
--- a/trailer.c
+++ b/trailer.c
@@ -177,13 +177,11 @@ static void print_all(FILE *outfile, struct list_head *head,
 	}
 }
 
-static struct trailer_item *trailer_from_arg(struct arg_item *arg_tok)
+static struct trailer_item *trailer_from_arg(const struct arg_item *arg_tok)
 {
 	struct trailer_item *new_item = xcalloc(sizeof(*new_item), 1);
-	new_item->token = arg_tok->token;
-	new_item->value = arg_tok->value;
-	arg_tok->token = arg_tok->value = NULL;
-	free_arg_item(arg_tok);
+	new_item->token = xstrdup(arg_tok->token);
+	new_item->value = xstrdup(arg_tok->value);
 	return new_item;
 }
 
@@ -274,7 +272,6 @@ static void apply_arg_if_exists(struct trailer_item *in_tok,
 {
 	switch (arg_tok->conf.if_exists) {
 	case EXISTS_DO_NOTHING:
-		free_arg_item(arg_tok);
 		break;
 	case EXISTS_REPLACE:
 		apply_item_command(in_tok, arg_tok);
@@ -290,15 +287,11 @@ static void apply_arg_if_exists(struct trailer_item *in_tok,
 		apply_item_command(in_tok, arg_tok);
 		if (check_if_different(in_tok, arg_tok, 1, head))
 			add_arg_to_input_list(on_tok, arg_tok);
-		else
-			free_arg_item(arg_tok);
 		break;
 	case EXISTS_ADD_IF_DIFFERENT_NEIGHBOR:
 		apply_item_command(in_tok, arg_tok);
 		if (check_if_different(on_tok, arg_tok, 0, head))
 			add_arg_to_input_list(on_tok, arg_tok);
-		else
-			free_arg_item(arg_tok);
 		break;
 	default:
 		BUG("trailer.c: unhandled value %d",
@@ -314,7 +307,6 @@ static void apply_arg_if_missing(struct list_head *head,
 
 	switch (arg_tok->conf.if_missing) {
 	case MISSING_DO_NOTHING:
-		free_arg_item(arg_tok);
 		break;
 	case MISSING_ADD:
 		where = arg_tok->conf.where;
@@ -364,15 +356,13 @@ static int find_same_and_apply_arg(struct list_head *head,
 static void process_trailers_lists(struct list_head *head,
 				   struct list_head *arg_head)
 {
-	struct list_head *pos, *p;
+	struct list_head *pos;
 	struct arg_item *arg_tok;
 
-	list_for_each_safe(pos, p, arg_head) {
+	list_for_each(pos, arg_head) {
 		int applied = 0;
 		arg_tok = list_entry(pos, struct arg_item, list);
 
-		list_del(pos);
-
 		applied = find_same_and_apply_arg(head, arg_tok);
 
 		if (!applied)
@@ -999,6 +989,15 @@ static void free_all_trailer_items(struct list_head *head)
 	}
 }
 
+static void free_all_arg_items(struct list_head *head)
+{
+	struct list_head *pos, *p;
+	list_for_each_safe(pos, p, head) {
+		list_del(pos);
+		free_arg_item(list_entry(pos, struct arg_item, list));
+	}
+}
+
 static struct tempfile *trailers_tempfile;
 
 static FILE *create_in_place_tempfile(const char *file)
@@ -1035,6 +1034,7 @@ void process_trailers(const char *file,
 		      struct list_head *new_trailer_head)
 {
 	LIST_HEAD(head);
+	LIST_HEAD(arg_head);
 	struct strbuf sb = STRBUF_INIT;
 	size_t trailer_end;
 	FILE *outfile = stdout;
@@ -1050,7 +1050,6 @@ void process_trailers(const char *file,
 	trailer_end = process_input_file(outfile, sb.buf, &head, opts);
 
 	if (!opts->only_input) {
-		LIST_HEAD(arg_head);
 		process_command_line_args(&arg_head, new_trailer_head);
 		process_trailers_lists(&head, &arg_head);
 	}
@@ -1058,6 +1057,7 @@ void process_trailers(const char *file,
 	print_all(outfile, &head, opts);
 
 	free_all_trailer_items(&head);
+	free_all_arg_items(&arg_head);
 
 	/* Print the lines after the trailers as is */
 	if (!opts->only_trailers)
-- 
2.25.1
Previous: Jeff KingNext: Anders Waldenborg
Message 13 of 67 in “trailer fixes”
  1. 00/21 trailer fixesAnders Waldenborg, Oct 25, 2020
  2. 06/21 t4205: add test for trailer in log with nonstandard separatorAnders Waldenborg, Oct 25, 2020
  3. Christian CouderOct 26, 2020
  4. Anders WaldenborgNov 9, 2020
  5. Christian CouderNov 10, 2020
  6. Jeff KingNov 10, 2020
  7. 03/21 doc: mention canonicalization in git i-t manualAnders Waldenborg, Oct 25, 2020
  8. Christian CouderOct 26, 2020
  9. 19/21 trailer: move config lookup out of parse_trailerAnders Waldenborg, Oct 25, 2020
  10. 20/21 trailer: add failing tests for matching trailers against inputAnders Waldenborg, Oct 25, 2020
  11. 13/21 trailer: add option to make canonicalization optionalAnders Waldenborg, Oct 25, 2020
  12. Jeff KingNov 10, 2020
  13. 07/21 trailer: simplify 'arg_item' lifetimeAnders Waldenborg, Oct 25, 2020
  14. 14/21 trailer: move skipping of blank lines to own loop when finding trailerAnders Waldenborg, Oct 25, 2020
  15. 04/21 pretty: allow using aliases in %(trailer:key=xyz)Anders Waldenborg, Oct 25, 2020
  16. Christian CouderOct 26, 2020
  17. 09/21 trailer: refactor print_tok_val into taking itemAnders Waldenborg, Oct 25, 2020
  18. 10/21 trailer: move trailer token canonicalization print timeAnders Waldenborg, Oct 25, 2020
  19. 08/21 trailer: keep track of conf in trailer_itemAnders Waldenborg, Oct 25, 2020
  20. Jeff KingNov 10, 2020
  21. 17/21 trailer: don't treat line with prefix of known trailer as knownAnders Waldenborg, Oct 25, 2020
  22. Jeff KingNov 10, 2020
  23. 16/21 t7513: add failing test for configured trailing line classificationAnders Waldenborg, Oct 25, 2020
  24. 02/21 trailer: don't use 'struct arg_item' for storing configAnders Waldenborg, Oct 25, 2020
  25. 12/21 trailer: handle configured nondefault separators explicitlyAnders Waldenborg, Oct 25, 2020
  26. Jeff KingNov 10, 2020
  27. 11/21 trailer: remember separator used in inputAnders Waldenborg, Oct 25, 2020
  28. 18/21 trailer: factor out config lookup to separate functionAnders Waldenborg, Oct 25, 2020
  29. 05/21 trailer: rename 'free_all' to 'free_all_trailer_items'Anders Waldenborg, Oct 25, 2020
  30. Christian CouderOct 26, 2020
  31. Jeff KingNov 10, 2020
  32. 01/21 trailer: change token_{from,matches}_item into taking conf_infoAnders Waldenborg, Oct 25, 2020
  33. Christian CouderOct 26, 2020
  34. 15/21 trailer: factor out classify_trailer_lineAnders Waldenborg, Oct 25, 2020
  35. 21/21 trailer: only do prefix matching for configured trailers on commandlineAnders Waldenborg, Oct 25, 2020
  36. Christian CouderNov 10, 2020
  37. 1/5 pretty format %(trailers) test: split a long lineÆvar Arnfjörð Bjarmason, Dec 5, 2020
  38. 0/5 pretty format %(trailers): improve machine readabilityÆvar Arnfjörð Bjarmason, Dec 5, 2020
  39. Anders WaldenborgDec 5, 2020
  40. Ævar Arnfjörð BjarmasonDec 7, 2020
  41. 2/5 pretty format %(trailers) doc: avoid repetitionÆvar Arnfjörð Bjarmason, Dec 6, 2020
  42. Christian CouderDec 7, 2020
  43. 4/5 pretty format %(trailers): add a "keyonly"Ævar Arnfjörð Bjarmason, Dec 6, 2020
  44. Christian CouderDec 7, 2020
  45. 1/5 pretty format %(trailers) test: split a long lineÆvar Arnfjörð Bjarmason, Dec 6, 2020
  46. 3/5 pretty-format %(trailers): fix broken standalone "valueonly"Ævar Arnfjörð Bjarmason, Dec 6, 2020
  47. 0/5 pretty format %(trailers): improve machine readabilityÆvar Arnfjörð Bjarmason, Dec 6, 2020
  48. 1/5 pretty format %(trailers) test: split a long lineÆvar Arnfjörð Bjarmason, Dec 9, 2020
  49. 5/5 pretty format %(trailers): add a "key_value_separator"Ævar Arnfjörð Bjarmason, Dec 9, 2020
  50. 4/5 pretty format %(trailers): add a "keyonly"Ævar Arnfjörð Bjarmason, Dec 9, 2020
  51. 3/5 pretty-format %(trailers): fix broken standalone "valueonly"Ævar Arnfjörð Bjarmason, Dec 9, 2020
  52. 2/5 pretty format %(trailers) doc: avoid repetitionÆvar Arnfjörð Bjarmason, Dec 9, 2020
  53. Junio C HamanoDec 10, 2020
  54. 0/5 pretty format %(trailers): improve machine readabilityÆvar Arnfjörð Bjarmason, Dec 9, 2020
  55. Christian CouderDec 10, 2020
  56. Junio C HamanoDec 10, 2020
  57. 5/5 pretty format %(trailers): add a "key_value_separator"Ævar Arnfjörð Bjarmason, Dec 6, 2020
  58. 3/5 pretty format %(trailers): add a "keyonly"Ævar Arnfjörð Bjarmason, Dec 5, 2020
  59. Christian CouderDec 5, 2020
  60. Ævar Arnfjörð BjarmasonDec 5, 2020
  61. 2/5 pretty format %(trailers): avoid needless repetitionÆvar Arnfjörð Bjarmason, Dec 5, 2020
  62. Christian CouderDec 5, 2020
  63. 4/5 pretty-format %(trailers): fix broken standalone "valueonly"Ævar Arnfjörð Bjarmason, Dec 5, 2020
  64. Christian CouderDec 5, 2020
  65. 5/5 pretty format %(trailers): add a "key_value_separator"Ævar Arnfjörð Bjarmason, Dec 5, 2020
  66. Christian CouderDec 5, 2020
  67. Ævar Arnfjörð BjarmasonDec 5, 2020

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.