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

[PATCH 2/3] merge-ort: make clear_internal_opts() aware of partial clearing

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 15, 2020, 17:53 UTC
Message-ID
<fc26c1a11db76843b0a439d2c69567fcd7ad9ac2.1608054807.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.814.git.1608054807.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

In order to handle recursive merges, after merging merge-bases we need to clear away most of the data we had built up but some of it needs to be kept -- in particular the "output" field. Rename the function to reflect its future change in use.

Further, since "reinitialize" means we'll be reusing the fields immediately, take advantage of this to only partially clear maps, leaving the hashtable allocated and pre-sized. (This may be slightly out-of-order since the speedups aren't realized until there are far more strmaps in use, but the patch submission process already went out of order because of various questions and requests for strmap. Anyway, see commit 6ccdfc2a20 ("strmap: enable faster clearing and reusing of strmaps", 2020-11-05), for performance details about the use of strmap_partial_clear().)

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 merge-ort.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/merge-ort.c b/merge-ort.c
index 05ba92c91a6..10a97e944c4 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -253,10 +253,11 @@ static void free_strmap_strings(struct strmap *map)
 	}
 }
 
-static void clear_internal_opts(struct merge_options_internal *opti,
-				int reinitialize)
+static void clear_or_reinit_internal_opts(struct merge_options_internal *opti,
+					  int reinitialize)
 {
-	assert(!reinitialize);
+	void (*strmap_func)(struct strmap *, int) =
+		reinitialize ? strmap_partial_clear : strmap_clear;
 
 	/*
 	 * We marked opti->paths with strdup_strings = 0, so that we
@@ -266,14 +267,14 @@ static void clear_internal_opts(struct merge_options_internal *opti,
 	 * to deallocate them.
 	 */
 	free_strmap_strings(&opti->paths);
-	strmap_clear(&opti->paths, 1);
+	strmap_func(&opti->paths, 1);
 
 	/*
 	 * All keys and values in opti->conflicted are a subset of those in
 	 * opti->paths.  We don't want to deallocate anything twice, so we
 	 * don't free the keys and we pass 0 for free_values.
 	 */
-	strmap_clear(&opti->conflicted, 0);
+	strmap_func(&opti->conflicted, 0);
 
 	/*
 	 * opti->paths_to_free is similar to opti->paths; we created it with
@@ -1344,7 +1345,7 @@ void merge_finalize(struct merge_options *opt,
 
 	assert(opt->priv == NULL);
 
-	clear_internal_opts(opti, 0);
+	clear_or_reinit_internal_opts(opti, 0);
 	FREE_AND_NULL(opti);
 }
 
-- 
gitgitgadget
Previous: Elijah NewrenNext: Elijah Newren via GitGitGadget
Message 6 of 37 in “merge-ort: implement recursive merges”
  1. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 15, 2020
  2. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 15, 2020
  3. Junio C HamanoDec 16, 2020
  4. Elijah NewrenDec 16, 2020
  5. Elijah NewrenDec 16, 2020
  6. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 15, 2020
  7. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 15, 2020
  8. Junio C HamanoDec 16, 2020
  9. Johannes SchindelinDec 16, 2020
  10. Elijah NewrenDec 16, 2020
  11. Derrick StoleeDec 16, 2020
  12. Junio C HamanoDec 16, 2020
  13. Felipe ContrerasDec 16, 2020
  14. Elijah NewrenDec 16, 2020
  15. Junio C HamanoDec 16, 2020
  16. Felipe ContrerasDec 16, 2020
  17. Elijah NewrenDec 16, 2020
  18. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  19. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  20. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020
  21. Junio C HamanoDec 16, 2020
  22. Elijah NewrenDec 16, 2020
  23. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  24. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  25. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  26. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  27. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020
  28. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  29. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  30. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  31. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020
  32. 0/4 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  33. 1/4 commit: move reverse_commit_list() from merge-recursiveElijah Newren via GitGitGadget, Dec 16, 2020
  34. Derrick StoleeDec 17, 2020
  35. 2/4 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  36. 3/4 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  37. 4/4 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 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.