Skip to content

Commit 0d1d22f

Browse files
pks-tgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b8849e2 commit 0d1d22f

File tree

6 files changed

+21
-18
lines changed

6 files changed

+21
-18
lines changed

commit.c

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ int commit_graft_pos(struct repository *r, const struct object_id *oid)
177177
commit_graft_oid_access);
178178
}
179179

180-
static void unparse_commit(struct repository *r, const struct object_id *oid)
180+
void unparse_commit(struct repository *r, const struct object_id *oid)
181181
{
182182
struct commit *c = lookup_commit(r, oid);
183183

@@ -318,18 +318,6 @@ int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
318318
return ret;
319319
}
320320

321-
void reset_commit_grafts(struct repository *r)
322-
{
323-
int i;
324-
325-
for (i = 0; i < r->parsed_objects->grafts_nr; i++) {
326-
unparse_commit(r, &r->parsed_objects->grafts[i]->oid);
327-
free(r->parsed_objects->grafts[i]);
328-
}
329-
r->parsed_objects->grafts_nr = 0;
330-
r->parsed_objects->commit_graft_prepared = 0;
331-
}
332-
333321
struct commit_buffer {
334322
void *buffer;
335323
unsigned long size;

commit.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ static inline int repo_parse_commit_no_graph(struct repository *r,
108108

109109
void parse_commit_or_die(struct commit *item);
110110

111+
void unparse_commit(struct repository *r, const struct object_id *oid);
112+
111113
struct buffer_slab;
112114
struct buffer_slab *allocate_commit_buffer_slab(void);
113115
void free_commit_buffer_slab(struct buffer_slab *bs);
@@ -240,7 +242,6 @@ int commit_graft_pos(struct repository *r, const struct object_id *oid);
240242
int register_commit_graft(struct repository *r, struct commit_graft *, int);
241243
void prepare_commit_graft(struct repository *r);
242244
struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid);
243-
void reset_commit_grafts(struct repository *r);
244245

245246
struct commit *get_fork_point(const char *refname, struct commit *commit);
246247

object.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,11 +545,12 @@ void repo_clear_commit_marks(struct repository *r, unsigned int flags)
545545
}
546546
}
547547

548-
struct parsed_object_pool *parsed_object_pool_new(void)
548+
struct parsed_object_pool *parsed_object_pool_new(struct repository *repo)
549549
{
550550
struct parsed_object_pool *o = xmalloc(sizeof(*o));
551551
memset(o, 0, sizeof(*o));
552552

553+
o->repo = repo;
553554
o->blob_state = allocate_alloc_state();
554555
o->tree_state = allocate_alloc_state();
555556
o->commit_state = allocate_alloc_state();
@@ -628,6 +629,16 @@ void raw_object_store_clear(struct raw_object_store *o)
628629
hashmap_clear(&o->pack_map);
629630
}
630631

632+
void parsed_object_pool_reset_commit_grafts(struct parsed_object_pool *o)
633+
{
634+
for (int i = 0; i < o->grafts_nr; i++) {
635+
unparse_commit(o->repo, &o->grafts[i]->oid);
636+
free(o->grafts[i]);
637+
}
638+
o->grafts_nr = 0;
639+
o->commit_graft_prepared = 0;
640+
}
641+
631642
void parsed_object_pool_clear(struct parsed_object_pool *o)
632643
{
633644
/*
@@ -659,6 +670,7 @@ void parsed_object_pool_clear(struct parsed_object_pool *o)
659670
free_commit_buffer_slab(o->buffer_slab);
660671
o->buffer_slab = NULL;
661672

673+
parsed_object_pool_reset_commit_grafts(o);
662674
clear_alloc_state(o->blob_state);
663675
clear_alloc_state(o->tree_state);
664676
clear_alloc_state(o->commit_state);

object.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ struct buffer_slab;
77
struct repository;
88

99
struct parsed_object_pool {
10+
struct repository *repo;
1011
struct object **obj_hash;
1112
int nr_objs, obj_hash_size;
1213

@@ -31,8 +32,9 @@ struct parsed_object_pool {
3132
struct buffer_slab *buffer_slab;
3233
};
3334

34-
struct parsed_object_pool *parsed_object_pool_new(void);
35+
struct parsed_object_pool *parsed_object_pool_new(struct repository *repo);
3536
void parsed_object_pool_clear(struct parsed_object_pool *o);
37+
void parsed_object_pool_reset_commit_grafts(struct parsed_object_pool *o);
3638

3739
struct object_list {
3840
struct object *item;

repository.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void initialize_repository(struct repository *repo)
5454
{
5555
repo->objects = raw_object_store_new();
5656
repo->remote_state = remote_state_new();
57-
repo->parsed_objects = parsed_object_pool_new();
57+
repo->parsed_objects = parsed_object_pool_new(repo);
5858
ALLOC_ARRAY(repo->index, 1);
5959
index_state_init(repo->index, repo);
6060

shallow.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ static void reset_repository_shallow(struct repository *r)
9797
{
9898
r->parsed_objects->is_shallow = -1;
9999
stat_validity_clear(r->parsed_objects->shallow_stat);
100-
reset_commit_grafts(r);
100+
parsed_object_pool_reset_commit_grafts(r->parsed_objects);
101101
}
102102

103103
int commit_shallow_file(struct repository *r, struct shallow_lock *lk)

0 commit comments

Comments
 (0)