object: clear grafts when clearing parsed object pool
We do not clear grafts part of the parsed object pool when clearing the pool itself, which can lead to memory leaks when a repository is being cleared. Fix this by moving `reset_commit_grafts()` into "object.c" and making it part of the `struct parsed_object_pool` interface such that we can call it from `parsed_object_pool_clear()`. Adapt `parsed_object_pool_new()` to take and store a reference to its owning repository, which is needed by `unparse_commit()`. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
b8849e236f
commit
0d1d22f5a3
14
object.c
14
object.c
@@ -545,11 +545,12 @@ void repo_clear_commit_marks(struct repository *r, unsigned int flags)
|
||||
}
|
||||
}
|
||||
|
||||
struct parsed_object_pool *parsed_object_pool_new(void)
|
||||
struct parsed_object_pool *parsed_object_pool_new(struct repository *repo)
|
||||
{
|
||||
struct parsed_object_pool *o = xmalloc(sizeof(*o));
|
||||
memset(o, 0, sizeof(*o));
|
||||
|
||||
o->repo = repo;
|
||||
o->blob_state = allocate_alloc_state();
|
||||
o->tree_state = allocate_alloc_state();
|
||||
o->commit_state = allocate_alloc_state();
|
||||
@@ -628,6 +629,16 @@ void raw_object_store_clear(struct raw_object_store *o)
|
||||
hashmap_clear(&o->pack_map);
|
||||
}
|
||||
|
||||
void parsed_object_pool_reset_commit_grafts(struct parsed_object_pool *o)
|
||||
{
|
||||
for (int i = 0; i < o->grafts_nr; i++) {
|
||||
unparse_commit(o->repo, &o->grafts[i]->oid);
|
||||
free(o->grafts[i]);
|
||||
}
|
||||
o->grafts_nr = 0;
|
||||
o->commit_graft_prepared = 0;
|
||||
}
|
||||
|
||||
void parsed_object_pool_clear(struct parsed_object_pool *o)
|
||||
{
|
||||
/*
|
||||
@@ -659,6 +670,7 @@ void parsed_object_pool_clear(struct parsed_object_pool *o)
|
||||
free_commit_buffer_slab(o->buffer_slab);
|
||||
o->buffer_slab = NULL;
|
||||
|
||||
parsed_object_pool_reset_commit_grafts(o);
|
||||
clear_alloc_state(o->blob_state);
|
||||
clear_alloc_state(o->tree_state);
|
||||
clear_alloc_state(o->commit_state);
|
||||
|
||||
Reference in New Issue
Block a user