]> git.ipfire.org Git - thirdparty/git.git/commitdiff
delta-islands: free island_marks and bitmaps
authorEric Wong <e@80x24.org>
Fri, 3 Feb 2023 23:44:30 +0000 (23:44 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 4 Feb 2023 02:01:46 +0000 (18:01 -0800)
On my mirror of linux.git forkgroup with 780 islands, this saves
nearly 4G of heap memory in pack-objects.  This savings only
benefits delta island users of pack bitmaps, as the process
would otherwise be exiting anyways.

However, there's probably not many delta island users, but the
majority of delta island users would also be pack bitmaps users.

Signed-off-by: Eric Wong <e@80x24.org>
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c
delta-islands.c
delta-islands.h

index 573d0b20b76b5115c99781b28f65ae1b5d7d8dc3..f305dd318769a00aaa40599d326dbbcb4da9f491 100644 (file)
@@ -929,8 +929,10 @@ static struct object_entry **compute_write_order(void)
         */
        for_each_tag_ref(mark_tagged, NULL);
 
-       if (use_delta_islands)
+       if (use_delta_islands) {
                max_layers = compute_pack_layers(&to_pack);
+               free_island_marks();
+       }
 
        ALLOC_ARRAY(wo, to_pack.nr_objects);
        wo_end = 0;
index 90c0d6958f4003b6b883366788ff15943151204d..8b234cb85b03b26b3f7360420e65a8e88c6b2df0 100644 (file)
@@ -513,6 +513,20 @@ void propagate_island_marks(struct commit *commit)
        }
 }
 
+void free_island_marks(void)
+{
+       struct island_bitmap *bitmap;
+
+       kh_foreach_value(island_marks, bitmap, {
+               if (!--bitmap->refcount)
+                       free(bitmap);
+       });
+       kh_destroy_oid_map(island_marks);
+
+       /* detect use-after-free with a an address which is never valid: */
+       island_marks = (void *)-1;
+}
+
 int compute_pack_layers(struct packing_data *to_pack)
 {
        uint32_t i;
index eb0f952629fc0a6cdcc113e19a04ddaa54bb32dd..8d1591ae28be302d2bb56fe05ad6c3465bf7668a 100644 (file)
@@ -14,5 +14,6 @@ void resolve_tree_islands(struct repository *r,
 void load_delta_islands(struct repository *r, int progress);
 void propagate_island_marks(struct commit *commit);
 int compute_pack_layers(struct packing_data *to_pack);
+void free_island_marks(void);
 
 #endif /* DELTA_ISLANDS_H */