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

[PATCH 4/7] merge-ort: add a paths_to_free field to merge_options_internal

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 3, 2020, 15:59 UTC
Message-ID
<d37724031f2bced7b7f6fb3a0a5266a20a99b1cc.1607011187.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.803.git.1607011187.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

This field will be used in future patches to allow removal of paths from opt->priv->paths.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 merge-ort.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/merge-ort.c b/merge-ort.c
index bcd53d3799..89b9fdb04a 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -41,6 +41,8 @@ struct merge_options_internal {
 	 *   * these keys serve to intern all the path strings, which allows
 	 *     us to do pointer comparison on directory names instead of
 	 *     strcmp; we just have to be careful to use the interned strings.
+	 *     (Technically paths_to_free may track some strings that were
+	 *      removed from froms paths.)
 	 *
 	 * The values of paths:
 	 *   * either a pointer to a merged_info, or a conflict_info struct
@@ -75,6 +77,16 @@ struct merge_options_internal {
 	 */
 	struct strmap conflicted;
 
+	/*
+	 * paths_to_free: additional list of strings to free
+	 *
+	 * If keys are removed from "paths", they are added to paths_to_free
+	 * to ensure they are later freed.  We avoid free'ing immediately since
+	 * other places (e.g. conflict_info.pathnames[]) may still be
+	 * referencing these paths.
+	 */
+	struct string_list paths_to_free;
+
 	/*
 	 * current_dir_name: temporary var used in collect_merge_info_callback()
 	 *
@@ -222,6 +234,17 @@ static void clear_internal_opts(struct merge_options_internal *opti,
 	 * don't free the keys and we pass 0 for free_values.
 	 */
 	strmap_clear(&opti->conflicted, 0);
+
+	/*
+	 * opti->paths_to_free is similar to opti->paths; we created it with
+	 * strdup_strings = 0 to avoid making _another_ copy of the fullpath
+	 * but now that we've used it and have no other references to these
+	 * strings, it is time to deallocate them.  We do so by temporarily
+	 * setting strdup_strings to 1.
+	 */
+	opti->paths_to_free.strdup_strings = 1;
+	string_list_clear(&opti->paths_to_free, 0);
+	opti->paths_to_free.strdup_strings = 0;
 }
 
 static int err(struct merge_options *opt, const char *err, ...)
@@ -1206,13 +1229,14 @@ static void merge_start(struct merge_options *opt, struct merge_result *result)
 	 * Although we initialize opt->priv->paths with strdup_strings=0,
 	 * that's just to avoid making yet another copy of an allocated
 	 * string.  Putting the entry into paths means we are taking
-	 * ownership, so we will later free it.
+	 * ownership, so we will later free it.  paths_to_free is similar.
 	 *
 	 * In contrast, conflicted just has a subset of keys from paths, so
 	 * we don't want to free those (it'd be a duplicate free).
 	 */
 	strmap_init_with_options(&opt->priv->paths, NULL, 0);
 	strmap_init_with_options(&opt->priv->conflicted, NULL, 0);
+	string_list_init(&opt->priv->paths_to_free, 0);
 }
 
 /*
-- 
gitgitgadget
Previous: Derrick StoleeNext: Elijah Newren via GitGitGadget
Message 5 of 13 in “merge-ort: some groundwork for further implementation”
  1. 0/7 merge-ort: some groundwork for further implementationElijah Newren via GitGitGadget, Dec 3, 2020
  2. 3/7 merge-ort: add a path_conflict field to merge_options_internalElijah Newren via GitGitGadget, Dec 3, 2020
  3. 2/7 merge-ort: add a clear_internal_opts helperElijah Newren via GitGitGadget, Dec 3, 2020
  4. Derrick StoleeDec 3, 2020
  5. 4/7 merge-ort: add a paths_to_free field to merge_options_internalElijah Newren via GitGitGadget, Dec 3, 2020
  6. 5/7 merge-ort: add function grouping commentsElijah Newren via GitGitGadget, Dec 3, 2020
  7. 1/7 merge-ort: add a few includesElijah Newren via GitGitGadget, Dec 3, 2020
  8. 6/7 merge-ort: add die-not-implemented stub handle_content_merge() functionElijah Newren via GitGitGadget, Dec 3, 2020
  9. Derrick StoleeDec 3, 2020
  10. Elijah NewrenDec 3, 2020
  11. 7/7 merge-ort: add modify/delete handling and delayed output processingElijah Newren via GitGitGadget, Dec 3, 2020
  12. Derrick StoleeDec 4, 2020
  13. Elijah NewrenDec 4, 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.