mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-21 20:14:44 +00:00
commit
86cb34cb11
@ -62,11 +62,14 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
|||||||
if ((error = git_packfile__name(&packname, path)) < 0)
|
if ((error = git_packfile__name(&packname, path)) < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if (git_mutex_lock(&git__mwindow_mutex) < 0)
|
if (git_mutex_lock(&git__mwindow_mutex) < 0) {
|
||||||
|
giterr_set(GITERR_OS, "failed to lock mwindow mutex");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (git_mwindow_files_init() < 0) {
|
if (git_mwindow_files_init() < 0) {
|
||||||
git_mutex_unlock(&git__mwindow_mutex);
|
git_mutex_unlock(&git__mwindow_mutex);
|
||||||
|
git__free(packname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,31 +96,29 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
|||||||
git_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
|
git_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
|
||||||
git_mutex_unlock(&git__mwindow_mutex);
|
git_mutex_unlock(&git__mwindow_mutex);
|
||||||
|
|
||||||
if (error < 0)
|
if (error < 0) {
|
||||||
|
git_packfile_free(pack);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
*out = pack;
|
*out = pack;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_mwindow_put_pack(struct git_pack_file *pack)
|
void git_mwindow_put_pack(struct git_pack_file *pack)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
git_strmap_iter pos;
|
git_strmap_iter pos;
|
||||||
|
|
||||||
if (git_mutex_lock(&git__mwindow_mutex) < 0)
|
if (git_mutex_lock(&git__mwindow_mutex) < 0)
|
||||||
return -1;
|
return;
|
||||||
|
|
||||||
if (git_mwindow_files_init() < 0) {
|
/* put before get would be a corrupted state */
|
||||||
git_mutex_unlock(&git__mwindow_mutex);
|
assert(git__pack_cache);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name);
|
pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name);
|
||||||
if (!git_strmap_valid_index(git__pack_cache, pos)) {
|
/* if we cannot find it, the state is corrupted */
|
||||||
git_mutex_unlock(&git__mwindow_mutex);
|
assert(git_strmap_valid_index(git__pack_cache, pos));
|
||||||
return GIT_ENOTFOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
count = git_atomic_dec(&pack->refcount);
|
count = git_atomic_dec(&pack->refcount);
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
@ -126,7 +127,7 @@ int git_mwindow_put_pack(struct git_pack_file *pack)
|
|||||||
}
|
}
|
||||||
|
|
||||||
git_mutex_unlock(&git__mwindow_mutex);
|
git_mutex_unlock(&git__mwindow_mutex);
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void git_mwindow_free_all(git_mwindow_file *mwf)
|
void git_mwindow_free_all(git_mwindow_file *mwf)
|
||||||
|
@ -48,6 +48,6 @@ void git_mwindow_files_free(void);
|
|||||||
|
|
||||||
struct git_pack_file; /* just declaration to avoid cyclical includes */
|
struct git_pack_file; /* just declaration to avoid cyclical includes */
|
||||||
int git_mwindow_get_pack(struct git_pack_file **out, const char *path);
|
int git_mwindow_get_pack(struct git_pack_file **out, const char *path);
|
||||||
int git_mwindow_put_pack(struct git_pack_file *pack);
|
void git_mwindow_put_pack(struct git_pack_file *pack);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -968,10 +968,10 @@ void git_packfile_free(struct git_pack_file *p)
|
|||||||
|
|
||||||
cache_free(&p->bases);
|
cache_free(&p->bases);
|
||||||
|
|
||||||
git_mwindow_free_all_locked(&p->mwf);
|
if (p->mwf.fd >= 0) {
|
||||||
|
git_mwindow_free_all_locked(&p->mwf);
|
||||||
if (p->mwf.fd >= 0)
|
|
||||||
p_close(p->mwf.fd);
|
p_close(p->mwf.fd);
|
||||||
|
}
|
||||||
|
|
||||||
pack_index_free(p);
|
pack_index_free(p);
|
||||||
|
|
||||||
|
@ -466,6 +466,7 @@ static int append_entry(
|
|||||||
|
|
||||||
git_strmap_insert(bld->map, entry->filename, entry, error);
|
git_strmap_insert(bld->map, entry->filename, entry, error);
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
|
git_tree_entry_free(entry);
|
||||||
giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename);
|
giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -622,6 +623,7 @@ int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source)
|
|||||||
GITERR_CHECK_ALLOC(bld);
|
GITERR_CHECK_ALLOC(bld);
|
||||||
|
|
||||||
if (git_strmap_alloc(&bld->map) < 0) {
|
if (git_strmap_alloc(&bld->map) < 0) {
|
||||||
|
git__free(bld);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user