diff options
author | Jonathan Tan <jonathantanmy@google.com> | 2018-06-07 12:04:14 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-06-21 12:22:48 -0700 |
commit | f3c23db2d7e764b247f7d76a8d0ba180811e9525 (patch) | |
tree | da2cc54ff72aadae315b6a324678bbc9828c1763 /pack-bitmap.c | |
parent | pack-bitmap: remove bitmap_git global variable (diff) | |
download | tgif-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.c | 35 |
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); +} |