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

[PATCH 04/15] replace-object: eliminate replace objects prepared flag

From
Stefan Beller <sbeller@google.com>
Date
Apr 12, 2018, 00:21 UTC
Message-ID
<20180412002118.102976-5-sbeller@google.com>
In-Reply-To
<20180412002118.102976-1-sbeller@google.com>
Make the oidmap a pointer.

That way we eliminate the need for the global boolean variable 'replace_object_prepared' as we can put this information into the pointer being NULL or not.

Another advantage of this is that we would more quickly catch code that tries to access replace-map without initializing it.

This also allows the '#include "oidmap.h"' introduced in a previous patch to be replaced by the forward declaration of 'struct oidmap;'. Keeping the type opaque discourages circumventing accessor functions; not dragging in other headers avoids some compile time overhead.

One disadvantage of this is change is performance as we need to pay the overhead for a malloc. The alternative of moving the global variable into the object store is less modular code.

Helped-by: René Scharfe <l.s.r@web.de>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
 object-store.h   |  2 +-
 replace_object.c | 16 +++++++++-------
 2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/object-store.h b/object-store.h
index c04b4c95eb..1ff862c7f9 100644
--- a/object-store.h
+++ b/object-store.h
@@ -99,7 +99,7 @@ struct raw_object_store {
 	 * Objects that should be substituted by other objects
 	 * (see git-replace(1)).
 	 */
-	struct oidmap replace_map;
+	struct oidmap *replace_map;
 
 	/*
 	 * private data
diff --git a/replace_object.c b/replace_object.c
index afbdf2df25..953fa9cc40 100644
--- a/replace_object.c
+++ b/replace_object.c
@@ -25,7 +25,7 @@ static int register_replace_ref(const char *refname,
 	oidcpy(&repl_obj->replacement, oid);
 
 	/* Register new object */
-	if (oidmap_put(&the_repository->objects->replace_map, repl_obj))
+	if (oidmap_put(the_repository->objects->replace_map, repl_obj))
 		die("duplicate replace ref: %s", refname);
 
 	return 0;
@@ -33,14 +33,16 @@ static int register_replace_ref(const char *refname,
 
 static void prepare_replace_object(void)
 {
-	static int replace_object_prepared;
-
-	if (replace_object_prepared)
+	if (the_repository->objects->replace_map)
 		return;
 
+	the_repository->objects->replace_map =
+		xmalloc(sizeof(*the_repository->objects->replace_map));
+	oidmap_init(the_repository->objects->replace_map, 0);
+
 	for_each_replace_ref(register_replace_ref, NULL);
-	replace_object_prepared = 1;
-	if (!the_repository->objects->replace_map.map.tablesize)
+
+	if (!the_repository->objects->replace_map->map.tablesize)
 		check_replace_refs = 0;
 }
 
@@ -64,7 +66,7 @@ const struct object_id *do_lookup_replace_object(const struct object_id *oid)
 	/* Try to recursively replace the object */
 	while (depth-- > 0) {
 		struct replace_object *repl_obj =
-			oidmap_get(&the_repository->objects->replace_map, cur);
+			oidmap_get(the_repository->objects->replace_map, cur);
 		if (!repl_obj)
 			return cur;
 		cur = &repl_obj->replacement;
-- 
2.17.0.484.g0c8726318c-goog
Previous: Stefan BellerNext: Stefan Beller
Message 80 of 91 in “object-store refactoring 3 (replace objects, main ref store)”
  1. 00/19 object-store refactoring 3 (replace objects, main ref store)Stefan Beller, Apr 6, 2018
  2. 01/19 replace_object.c: rename to use dash in file nameStefan Beller, Apr 6, 2018
  3. 02/19 replace-object: move replace_object to object storeStefan Beller, Apr 6, 2018
  4. Derrick StoleeApr 9, 2018
  5. 03/19 object-store: move lookup_replace_object to replace-object.hStefan Beller, Apr 6, 2018
  6. 08/19 replace-object: add repository argument to replace_object_posStefan Beller, Apr 6, 2018
  7. 09/19 replace-object: add repository argument to register_replace_objectStefan Beller, Apr 6, 2018
  8. 11/19 replace-object: add repository argument to do_lookup_replace_objectStefan Beller, Apr 6, 2018
  9. 12/19 replace-object: add repository argument to lookup_replace_objectStefan Beller, Apr 6, 2018
  10. 13/19 refs: store the main ref store inside the repository structStefan Beller, Apr 6, 2018
  11. Eric SunshineApr 7, 2018
  12. 15/19 replace-object: allow replace_object_pos to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  13. 14/19 refs: allow for_each_replace_ref to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  14. 17/19 replace-object: allow prepare_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  15. 16/19 replace-object: allow register_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  16. 19/19 replace-object: allow lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  17. 18/19 replace-object: allow do_lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  18. 10/19 replace-object: add repository argument to prepare_replace_objectStefan Beller, Apr 6, 2018
  19. 04/19 replace-object: move replace objects prepared flag to object storeStefan Beller, Apr 6, 2018
  20. 07/19 refs: add repository argument to for_each_replace_refStefan Beller, Apr 6, 2018
  21. 05/19 replace-object: check_replace_refs is safe in multi repo environmentStefan Beller, Apr 6, 2018
  22. 06/19 refs: add repository argument to get_main_ref_storeStefan Beller, Apr 6, 2018
  23. Eric SunshineApr 7, 2018
  24. Stefan BellerApr 9, 2018
  25. René ScharfeApr 7, 2018
  26. Stefan BellerApr 9, 2018
  27. Duy NguyenApr 7, 2018
  28. Stefan BellerApr 9, 2018
  29. Derrick StoleeApr 9, 2018
  30. 00/16 object-store refactoring 3 (replace objects, main ref store)Stefan Beller, Apr 9, 2018
  31. 01/16 replace_object: use oidmapStefan Beller, Apr 9, 2018
  32. Junio C HamanoApr 10, 2018
  33. 03/16 replace-object: move replace_map to object storeStefan Beller, Apr 9, 2018
  34. Junio C HamanoApr 10, 2018
  35. 02/16 replace_object.c: rename to use dash in file nameStefan Beller, Apr 9, 2018
  36. Junio C HamanoApr 10, 2018
  37. Stefan BellerApr 10, 2018
  38. 0/6 Rename files to use dashes instead of underscoresStefan Beller, Apr 10, 2018
  39. 1/6 write_or_die.c: rename to use dashes in file nameStefan Beller, Apr 10, 2018
  40. 2/6 unicode_width.h: rename to use dash in file nameStefan Beller, Apr 10, 2018
  41. 3/6 exec_cmd: rename to use dash in file nameStefan Beller, Apr 10, 2018
  42. 5/6 sha1_file.c: rename to use dash in file nameStefan Beller, Apr 10, 2018
  43. 6/6 replace_object.c: rename to use dash in file nameStefan Beller, Apr 10, 2018
  44. 4/6 sha1_name.c: rename to use dash in file nameStefan Beller, Apr 10, 2018
  45. Stefan BellerApr 10, 2018
  46. Johannes SchindelinApr 10, 2018
  47. Stefan BellerApr 10, 2018
  48. brian m. carlsonApr 11, 2018
  49. 04/16 object-store: move lookup_replace_object to replace-object.hStefan Beller, Apr 9, 2018
  50. 06/16 replace-object: check_replace_refs is safe in multi repo environmentStefan Beller, Apr 9, 2018
  51. Junio C HamanoApr 10, 2018
  52. 05/16 replace-object: eliminate replace objects prepared flagStefan Beller, Apr 9, 2018
  53. Junio C HamanoApr 10, 2018
  54. René ScharfeApr 10, 2018
  55. 07/16 refs: add repository argument to get_main_ref_storeStefan Beller, Apr 9, 2018
  56. Michael HaggertyApr 10, 2018
  57. Stefan BellerApr 10, 2018
  58. 08/16 refs: add repository argument to for_each_replace_refStefan Beller, Apr 9, 2018
  59. 09/16 replace-object: add repository argument to prepare_replace_objectStefan Beller, Apr 9, 2018
  60. 13/16 refs: allow for_each_replace_ref to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  61. 12/16 refs: store the main ref store inside the repository structStefan Beller, Apr 9, 2018
  62. Brandon WilliamsApr 9, 2018
  63. Stefan BellerApr 9, 2018
  64. Brandon WilliamsApr 9, 2018
  65. Michael HaggertyApr 10, 2018
  66. Stefan BellerApr 10, 2018
  67. 15/16 replace-object: allow do_lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  68. 14/16 replace-object: allow prepare_replace_object to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  69. 16/16 replace-object: allow lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  70. 11/16 replace-object: add repository argument to lookup_replace_objectStefan Beller, Apr 9, 2018
  71. 10/16 replace-object: add repository argument to do_lookup_replace_objectStefan Beller, Apr 9, 2018
  72. Brandon WilliamsApr 9, 2018
  73. Stefan BellerApr 9, 2018
  74. 00/15 replace_object.c: rename to use dash in file nameStefan Beller, Apr 12, 2018
  75. 01/15 replace_object: use oidmapStefan Beller, Apr 12, 2018
  76. 02/15 replace-object: move replace_map to object storeStefan Beller, Apr 12, 2018
  77. 03/15 object-store: move lookup_replace_object to replace-object.hStefan Beller, Apr 12, 2018
  78. 05/15 replace-object: check_replace_refs is safe in multi repo environmentStefan Beller, Apr 12, 2018
  79. 07/15 refs: add repository argument to for_each_replace_refStefan Beller, Apr 12, 2018
  80. 04/15 replace-object: eliminate replace objects prepared flagStefan Beller, Apr 12, 2018
  81. 13/15 replace-object: allow prepare_replace_object to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  82. 12/15 refs: allow for_each_replace_ref to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  83. 14/15 replace-object: allow do_lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  84. 15/15 replace-object: allow lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  85. 06/15 refs: add repository argument to get_main_ref_storeStefan Beller, Apr 12, 2018
  86. 11/15 refs: store the main ref store inside the repository structStefan Beller, Apr 12, 2018
  87. 08/15 replace-object: add repository argument to prepare_replace_objectStefan Beller, Apr 12, 2018
  88. 09/15 replace-object: add repository argument to do_lookup_replace_objectStefan Beller, Apr 12, 2018
  89. 10/15 replace-object: add repository argument to lookup_replace_objectStefan Beller, Apr 12, 2018
  90. Derrick StoleeApr 12, 2018
  91. Stefan BellerApr 9, 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.