pack-bitmap: introduce `bitmap_writer_free()`

Now that there is clearer memory ownership around the bitmap_writer structure, introduce a bitmap_writer_free() function that callers may use to free any memory associated with their instance of the bitmap_writer structure. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Taylor Blau committed May 14, 2024 at 15:57 UTC 85f360fee53933d230fd231db5306b26809fabcf
4 files changed +27 -1
builtin/pack-objects.c
+2 -1
@@ -1245,7 +1245,6 @@ static void write_pack_file(void)
1245 uint32_t nr_remaining = nr_result;
1246 time_t last_mtime = 0;
1247 struct object_entry **write_order;
1248 - struct bitmap_writer bitmap_writer;
1248
1249 if (progress > pack_to_stdout)
1250 progress_state = start_progress(_("Writing objects"), nr_result);
@@ -1315,6 +1314,7 @@ static void write_pack_file(void)
1314 if (!pack_to_stdout) {
1315 struct stat st;
1316 struct strbuf tmpname = STRBUF_INIT;
1317 + struct bitmap_writer bitmap_writer;
1318 char *idx_tmp_name = NULL;
1319
1320 /*
@@ -1370,6 +1370,7 @@ static void write_pack_file(void)
1370 bitmap_writer_finish(&bitmap_writer,
1371 written_list, nr_written,
1372 tmpname.buf, write_bitmap_options);
1373 + bitmap_writer_free(&bitmap_writer);
1374 write_bitmap_index = 0;
1375 strbuf_setlen(&tmpname, tmpname_len);
1376 }
midx-write.c
+1
@@ -853,6 +853,7 @@ static int write_midx_bitmap(const char *midx_name,
853 cleanup:
854 free(index);
855 free(bitmap_name);
856 + bitmap_writer_free(&writer);
857
858 trace2_region_leave("midx", "write_midx_bitmap", the_repository);
859
pack-bitmap-write.c
+23
@@ -32,6 +32,29 @@ void bitmap_writer_init(struct bitmap_writer *writer)
32 memset(writer, 0, sizeof(struct bitmap_writer));
33 }
34
35 +void bitmap_writer_free(struct bitmap_writer *writer)
36 +{
37 + uint32_t i;
38 +
39 + if (!writer)
40 + return;
41 +
42 + ewah_free(writer->commits);
43 + ewah_free(writer->trees);
44 + ewah_free(writer->blobs);
45 + ewah_free(writer->tags);
46 +
47 + kh_destroy_oid_map(writer->bitmaps);
48 +
49 + for (i = 0; i < writer->selected_nr; i++) {
50 + struct bitmapped_commit *bc = &writer->selected[i];
51 + if (bc->write_as != bc->bitmap)
52 + ewah_free(bc->write_as);
53 + ewah_free(bc->bitmap);
54 + }
55 + free(writer->selected);
56 +}
57 +
58 void bitmap_writer_show_progress(struct bitmap_writer *writer, int show)
59 {
60 writer->show_progress = show;
pack-bitmap.h
+1
@@ -139,6 +139,7 @@ void bitmap_writer_finish(struct bitmap_writer *writer,
139 uint32_t index_nr,
140 const char *filename,
141 uint16_t options);
142 +void bitmap_writer_free(struct bitmap_writer *writer);
143 char *midx_bitmap_filename(struct multi_pack_index *midx);
144 char *pack_bitmap_filename(struct packed_git *p);
145