vendor/libgit2/src/mwindow.c in rugged-0.21.1b2 vs vendor/libgit2/src/mwindow.c in rugged-0.21.2
- old
+ new
@@ -9,15 +9,11 @@
#include "mwindow.h"
#include "vector.h"
#include "fileops.h"
#include "map.h"
#include "global.h"
-#include "strmap.h"
-#include "pack.h"
-GIT__USE_STRMAP;
-
#define DEFAULT_WINDOW_SIZE \
(sizeof(void*) >= 8 \
? 1 * 1024 * 1024 * 1024 \
: 32 * 1024 * 1024)
@@ -28,131 +24,24 @@
size_t git_mwindow__mapped_limit = DEFAULT_MAPPED_LIMIT;
/* Whenever you want to read or modify this, grab git__mwindow_mutex */
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)
-{
- if (git__pack_cache)
- return 0;
-
- return git_strmap_alloc(&git__pack_cache);
-}
-
-void git_mwindow_files_free(void)
-{
- git_strmap *tmp = git__pack_cache;
-
- git__pack_cache = NULL;
- git_strmap_free(tmp);
-}
-
-int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
-{
- int error;
- char *packname;
- git_strmap_iter pos;
- struct git_pack_file *pack;
-
- if ((error = git_packfile__name(&packname, path)) < 0)
- return error;
-
- if (git_mutex_lock(&git__mwindow_mutex) < 0) {
- giterr_set(GITERR_OS, "failed to lock mwindow mutex");
- 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);
-
- if (git_strmap_valid_index(git__pack_cache, pos)) {
- pack = git_strmap_value_at(git__pack_cache, pos);
- git_atomic_inc(&pack->refcount);
-
- git_mutex_unlock(&git__mwindow_mutex);
- *out = pack;
- return 0;
- }
-
- /* If we didn't find it, we need to create it */
- if ((error = git_packfile_alloc(&pack, path)) < 0) {
- git_mutex_unlock(&git__mwindow_mutex);
- return error;
- }
-
- git_atomic_inc(&pack->refcount);
-
- git_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
- git_mutex_unlock(&git__mwindow_mutex);
-
- if (error < 0) {
- git_packfile_free(pack);
- return -1;
- }
-
- *out = pack;
- return 0;
-}
-
-void git_mwindow_put_pack(struct git_pack_file *pack)
-{
- int count;
- git_strmap_iter pos;
-
- if (git_mutex_lock(&git__mwindow_mutex) < 0)
- return;
-
- /* put before get would be a corrupted state */
- assert(git__pack_cache);
-
- pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name);
- /* if we cannot find it, the state is corrupted */
- assert(git_strmap_valid_index(git__pack_cache, pos));
-
- count = git_atomic_dec(&pack->refcount);
- if (count == 0) {
- git_strmap_delete_at(git__pack_cache, pos);
- git_packfile_free(pack);
- }
-
- git_mutex_unlock(&git__mwindow_mutex);
- return;
-}
-
-void git_mwindow_free_all(git_mwindow_file *mwf)
-{
- if (git_mutex_lock(&git__mwindow_mutex)) {
- giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
- return;
- }
-
- git_mwindow_free_all_locked(mwf);
-
- git_mutex_unlock(&git__mwindow_mutex);
-}
-
/*
* Free all the windows in a sequence, typically because we're done
* with the file
*/
-void git_mwindow_free_all_locked(git_mwindow_file *mwf)
+void git_mwindow_free_all(git_mwindow_file *mwf)
{
git_mwindow_ctl *ctl = &mem_ctl;
size_t i;
+ if (git_mutex_lock(&git__mwindow_mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
+ return;
+ }
+
/*
* Remove these windows from the global list
*/
for (i = 0; i < ctl->windowfiles.length; ++i){
if (git_vector_get(&ctl->windowfiles, i) == mwf) {
@@ -176,9 +65,11 @@
git_futils_mmap_free(&w->window_map);
mwf->windows = w->next;
git__free(w);
}
+
+ git_mutex_unlock(&git__mwindow_mutex);
}
/*
* Check if a window 'win' contains the address 'offset'
*/