Skip to content

Commit 6d1b2e4

Browse files
committed
Merge branch 'ew/free-island-marks'
"git pack-objects" learned to release delta-island bitmap data when it is done using it, saving peak heap memory usage. * ew/free-island-marks: delta-islands: free island_marks and bitmaps
2 parents 8a1d607 + 647982b commit 6d1b2e4

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

builtin/pack-objects.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,8 +929,10 @@ static struct object_entry **compute_write_order(void)
929929
*/
930930
for_each_tag_ref(mark_tagged, NULL);
931931

932-
if (use_delta_islands)
932+
if (use_delta_islands) {
933933
max_layers = compute_pack_layers(&to_pack);
934+
free_island_marks();
935+
}
934936

935937
ALLOC_ARRAY(wo, to_pack.nr_objects);
936938
wo_end = 0;

delta-islands.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,20 @@ void propagate_island_marks(struct commit *commit)
513513
}
514514
}
515515

516+
void free_island_marks(void)
517+
{
518+
struct island_bitmap *bitmap;
519+
520+
kh_foreach_value(island_marks, bitmap, {
521+
if (!--bitmap->refcount)
522+
free(bitmap);
523+
});
524+
kh_destroy_oid_map(island_marks);
525+
526+
/* detect use-after-free with a an address which is never valid: */
527+
island_marks = (void *)-1;
528+
}
529+
516530
int compute_pack_layers(struct packing_data *to_pack)
517531
{
518532
uint32_t i;

delta-islands.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ void resolve_tree_islands(struct repository *r,
1414
void load_delta_islands(struct repository *r, int progress);
1515
void propagate_island_marks(struct commit *commit);
1616
int compute_pack_layers(struct packing_data *to_pack);
17+
void free_island_marks(void);
1718

1819
#endif /* DELTA_ISLANDS_H */

0 commit comments

Comments
 (0)