]> git.ipfire.org Git - thirdparty/git.git/commitdiff
midx: stop using linked list when closing MIDX
authorPatrick Steinhardt <ps@pks.im>
Tue, 15 Jul 2025 11:29:20 +0000 (13:29 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 15 Jul 2025 19:07:29 +0000 (12:07 -0700)
When calling `close_midx()` we not only close the multi-pack index for
one object source, but instead we iterate through the whole linked list
of MIDXs to close all of them. This linked list is about to go away in
favor of using the new per-source pointer to its respective MIDX.

Refactor the function to iterate through sources instead.

Note that after this patch, there's a couple of callsites left that
continue to use `close_midx()` without iterating through all sources.
These are all cases where we don't care about the MIDX from other
sources though, so it's fine to keep them as-is.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
midx.c
packfile.c

diff --git a/midx.c b/midx.c
index 2f64c26058fa48e80dd215ef6b29dc769180b992..472d6bf17ab922b4c0cf6eabc489600953a422f1 100644 (file)
--- a/midx.c
+++ b/midx.c
@@ -401,7 +401,6 @@ void close_midx(struct multi_pack_index *m)
        if (!m)
                return;
 
-       close_midx(m->next);
        close_midx(m->base_midx);
 
        munmap((unsigned char *)m->data, m->data_len);
@@ -835,11 +834,15 @@ void clear_midx_file(struct repository *r)
 
        get_midx_filename(r->hash_algo, &midx, r->objects->sources->path);
 
-       if (r->objects && r->objects->multi_pack_index) {
-               close_midx(r->objects->multi_pack_index);
-               r->objects->multi_pack_index = NULL;
-               for (struct odb_source *source = r->objects->sources; source; source = source->next)
+       if (r->objects) {
+               struct odb_source *source;
+
+               for (source = r->objects->sources; source; source = source->next) {
+                       if (source->midx)
+                               close_midx(source->midx);
                        source->midx = NULL;
+               }
+               r->objects->multi_pack_index = NULL;
        }
 
        if (remove_path(midx.buf))
index 0b3142973b6252df1b86b881e9ebb178150b10ae..7b350f018ca78c3c1d22766d43940b3c59b35681 100644 (file)
@@ -361,6 +361,7 @@ void close_pack(struct packed_git *p)
 
 void close_object_store(struct object_database *o)
 {
+       struct odb_source *source;
        struct packed_git *p;
 
        for (p = o->packed_git; p; p = p->next)
@@ -369,12 +370,12 @@ void close_object_store(struct object_database *o)
                else
                        close_pack(p);
 
-       if (o->multi_pack_index) {
-               close_midx(o->multi_pack_index);
-               o->multi_pack_index = NULL;
-               for (struct odb_source *source = o->sources; source; source = source->next)
-                       source->midx = NULL;
+       for (source = o->sources; source; source = source->next) {
+               if (source->midx)
+                       close_midx(source->midx);
+               source->midx = NULL;
        }
+       o->multi_pack_index = NULL;
 
        close_commit_graph(o);
 }