about summary refs log tree commit diff
path: root/third_party/git/replace-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/replace-object.c')
-rw-r--r--third_party/git/replace-object.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/third_party/git/replace-object.c b/third_party/git/replace-object.c
index e295e8794310..7bd9aba6ee6c 100644
--- a/third_party/git/replace-object.c
+++ b/third_party/git/replace-object.c
@@ -34,14 +34,23 @@ static int register_replace_ref(struct repository *r,
 
 void prepare_replace_object(struct repository *r)
 {
-	if (r->objects->replace_map)
+	if (r->objects->replace_map_initialized)
 		return;
 
+	pthread_mutex_lock(&r->objects->replace_mutex);
+	if (r->objects->replace_map_initialized) {
+		pthread_mutex_unlock(&r->objects->replace_mutex);
+		return;
+	}
+
 	r->objects->replace_map =
 		xmalloc(sizeof(*r->objects->replace_map));
 	oidmap_init(r->objects->replace_map, 0);
 
 	for_each_replace_ref(r, register_replace_ref, NULL);
+	r->objects->replace_map_initialized = 1;
+
+	pthread_mutex_unlock(&r->objects->replace_mutex);
 }
 
 /* We allow "recursive" replacement. Only within reason, though */