On my use case involving 771 islands of Linux on kernel.org, this reduces memory usage by around 25MB. The bulk of that comes from free_remote_islands, since free_island_regexes only saves around 40k. This memory is saved early in the memory-intensive pack process, making it available for the remainder of the long process. Signed-off-by: Eric Wong <e@xxxxxxxxx> --- Note: I only noticed this when I screwed up up a pack.island RE, ended up with hundreds of thousands of islands instead of 771, and kept OOM-ing :x Memory savings were measured using the following patch which relies on a patched LD_PRELOAD-based malloc debugger: https://80x24.org/spew/20221116095404.3974691-1-e@xxxxxxxxx/raw Will try to hunt down more memory savings in the nearish future. delta-islands.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/delta-islands.c b/delta-islands.c index 26f9e99e1a..391e947cc6 100644 --- a/delta-islands.c +++ b/delta-islands.c @@ -454,6 +454,31 @@ static void deduplicate_islands(struct repository *r) free(list); } +static void free_island_regexes(void) +{ + unsigned int i; + + for (i = 0; i < island_regexes_nr; i++) + regfree(&island_regexes[i]); + + FREE_AND_NULL(island_regexes); + island_regexes_alloc = island_regexes_nr = 0; +} + +static void free_remote_islands(void) +{ + const char *island_name; + struct remote_island *rl; + + kh_foreach(remote_islands, island_name, rl, { + free((void *)island_name); + oid_array_clear(&rl->oids); + free(rl); + }); + kh_destroy_str(remote_islands); + remote_islands = NULL; +} + void load_delta_islands(struct repository *r, int progress) { island_marks = kh_init_oid_map(); @@ -461,7 +486,9 @@ void load_delta_islands(struct repository *r, int progress) git_config(island_config_callback, NULL); for_each_ref(find_island_for_ref, NULL); + free_island_regexes(); deduplicate_islands(r); + free_remote_islands(); if (progress) fprintf(stderr, _("Marked %d islands, done.\n"), island_counter);