Commit 886bd6a617281d598398be6dab6aa857a33debb5

Edward Thomson 2016-08-03T17:01:48

mwindow: init mwindow files in git_libgit2_init

diff --git a/src/global.c b/src/global.c
index e36912c..198bc1e 100644
--- a/src/global.c
+++ b/src/global.c
@@ -59,8 +59,9 @@ static int init_common(void)
 	if ((ret = git_hash_global_init()) == 0 &&
 		(ret = git_sysdir_global_init()) == 0 &&
 		(ret = git_filter_global_init()) == 0 &&
-		(ret = git_transport_ssh_global_init()) == 0)
-		ret = git_openssl_stream_global_init();
+		(ret = git_transport_ssh_global_init()) == 0 &&
+		(ret = git_openssl_stream_global_init()) == 0)
+		ret = git_mwindow_global_init();
 
 	GIT_MEMORY_BARRIER;
 
diff --git a/src/mwindow.c b/src/mwindow.c
index d3e9be7..8a5b5ca 100644
--- a/src/mwindow.c
+++ b/src/mwindow.c
@@ -33,25 +33,20 @@ static git_mwindow_ctl mem_ctl;
 /* Global list of mwindow files, to open packs once across repos */
 git_strmap *git__pack_cache = NULL;
 
-/**
- * Run under mwindow lock
- */
-int git_mwindow_files_init(void)
+static void git_mwindow_files_free(void)
 {
-	if (git__pack_cache)
-		return 0;
-
-	git__on_shutdown(git_mwindow_files_free);
+	git_strmap *tmp = git__pack_cache;
 
-	return git_strmap_alloc(&git__pack_cache);
+	git__pack_cache = NULL;
+	git_strmap_free(tmp);
 }
 
-void git_mwindow_files_free(void)
+int git_mwindow_global_init(void)
 {
-	git_strmap *tmp = git__pack_cache;
+	assert(!git__pack_cache);
 
-	git__pack_cache = NULL;
-	git_strmap_free(tmp);
+	git__on_shutdown(git_mwindow_files_free);
+	return git_strmap_alloc(&git__pack_cache);
 }
 
 int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
@@ -69,12 +64,6 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
 		return -1;
 	}
 
-	if (git_mwindow_files_init() < 0) {
-		git_mutex_unlock(&git__mwindow_mutex);
-		git__free(packname);
-		return -1;
-	}
-
 	pos = git_strmap_lookup_index(git__pack_cache, packname);
 	git__free(packname);
 
diff --git a/src/mwindow.h b/src/mwindow.h
index 63418e4..bdde9e0 100644
--- a/src/mwindow.h
+++ b/src/mwindow.h
@@ -43,8 +43,7 @@ int git_mwindow_file_register(git_mwindow_file *mwf);
 void git_mwindow_file_deregister(git_mwindow_file *mwf);
 void git_mwindow_close(git_mwindow **w_cursor);
 
-int git_mwindow_files_init(void);
-void git_mwindow_files_free(void);
+extern int git_mwindow_global_init(void);
 
 struct git_pack_file; /* just declaration to avoid cyclical includes */
 int git_mwindow_get_pack(struct git_pack_file **out, const char *path);
diff --git a/src/odb_pack.c b/src/odb_pack.c
index 5a57864..0764207 100644
--- a/src/odb_pack.c
+++ b/src/odb_pack.c
@@ -591,9 +591,6 @@ int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir)
 	struct pack_backend *backend = NULL;
 	git_buf path = GIT_BUF_INIT;
 
-	if (git_mwindow_files_init() < 0)
-		return -1;
-
 	if (pack_backend__alloc(&backend, 8) < 0)
 		return -1;