summaryrefslogtreecommitdiff
path: root/pack-bitmap.c
diff options
context:
space:
mode:
authorLibravatar Jonathan Tan <jonathantanmy@google.com>2018-06-07 12:04:14 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2018-06-21 12:22:48 -0700
commitf3c23db2d7e764b247f7d76a8d0ba180811e9525 (patch)
treeda2cc54ff72aadae315b6a324678bbc9828c1763 /pack-bitmap.c
parentpack-bitmap: remove bitmap_git global variable (diff)
downloadtgif-f3c23db2d7e764b247f7d76a8d0ba180811e9525.tar.xz
pack-bitmap: add free function
Add a function to free struct bitmap_index instances, and use it where needed (except when rebuild_existing_bitmaps() is used, since it creates references to the bitmaps within the struct bitmap_index passed to it). Note that the hashes field in struct bitmap_index is not freed because it points to another field within the same struct. The documentation for that field has been updated to clarify that. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'pack-bitmap.c')
-rw-r--r--pack-bitmap.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 70465b8bf5..f0a1937a1c 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -66,7 +66,7 @@ struct bitmap_index {
/* Number of bitmapped commits */
uint32_t entry_count;
- /* Name-hash cache (or NULL if not present). */
+ /* If not NULL, this is a name-hash cache pointing into map. */
uint32_t *hashes;
/*
@@ -350,6 +350,7 @@ struct bitmap_index *prepare_bitmap_git(void)
if (!open_pack_bitmap(bitmap_git) && !load_pack_bitmap(bitmap_git))
return bitmap_git;
+ free_bitmap_index(bitmap_git);
return NULL;
}
@@ -690,7 +691,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
/* try to open a bitmapped pack, but don't parse it yet
* because we may not need to use it */
if (open_pack_bitmap(bitmap_git) < 0)
- return NULL;
+ goto cleanup;
for (i = 0; i < revs->pending.nr; ++i) {
struct object *object = revs->pending.objects[i].item;
@@ -723,11 +724,11 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
* optimize here
*/
if (haves && !in_bitmapped_pack(bitmap_git, haves))
- return NULL;
+ goto cleanup;
/* if we don't want anything, we're done here */
if (!wants)
- return NULL;
+ goto cleanup;
/*
* now we're going to use bitmaps, so load the actual bitmap entries
@@ -735,7 +736,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
* becomes invalidated and we must perform the revwalk through bitmaps
*/
if (!bitmap_git->loaded && load_pack_bitmap(bitmap_git) < 0)
- return NULL;
+ goto cleanup;
object_array_clear(&revs->pending);
@@ -761,6 +762,10 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
bitmap_free(haves_bitmap);
return bitmap_git;
+
+cleanup:
+ free_bitmap_index(bitmap_git);
+ return NULL;
}
int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
@@ -1001,7 +1006,7 @@ void test_bitmap_walk(struct rev_info *revs)
else
fprintf(stderr, "Mismatch!\n");
- bitmap_free(result);
+ free_bitmap_index(bitmap_git);
}
static int rebuild_bitmap(uint32_t *reposition,
@@ -1093,3 +1098,21 @@ int rebuild_existing_bitmaps(struct bitmap_index *bitmap_git,
bitmap_free(rebuild);
return 0;
}
+
+void free_bitmap_index(struct bitmap_index *b)
+{
+ if (!b)
+ return;
+
+ if (b->map)
+ munmap(b->map, b->map_size);
+ ewah_pool_free(b->commits);
+ ewah_pool_free(b->trees);
+ ewah_pool_free(b->blobs);
+ ewah_pool_free(b->tags);
+ kh_destroy_sha1(b->bitmaps);
+ free(b->ext_index.objects);
+ free(b->ext_index.hashes);
+ bitmap_free(b->result);
+ free(b);
+}