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>
This commit is contained in:
parent
3ae5fa0768
commit
f3c23db2d7
@ -2945,6 +2945,7 @@ static int get_object_list_from_bitmap(struct rev_info *revs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
traverse_bitmap_commit_list(bitmap_git, &add_object_entry_from_bitmap);
|
traverse_bitmap_commit_list(bitmap_git, &add_object_entry_from_bitmap);
|
||||||
|
free_bitmap_index(bitmap_git);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,6 +521,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
|
|||||||
if (max_count >= 0 && max_count < commit_count)
|
if (max_count >= 0 && max_count < commit_count)
|
||||||
commit_count = max_count;
|
commit_count = max_count;
|
||||||
printf("%d\n", commit_count);
|
printf("%d\n", commit_count);
|
||||||
|
free_bitmap_index(bitmap_git);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else if (revs.max_count < 0 &&
|
} else if (revs.max_count < 0 &&
|
||||||
@ -528,6 +529,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
|
|||||||
struct bitmap_index *bitmap_git;
|
struct bitmap_index *bitmap_git;
|
||||||
if ((bitmap_git = prepare_bitmap_walk(&revs))) {
|
if ((bitmap_git = prepare_bitmap_walk(&revs))) {
|
||||||
traverse_bitmap_commit_list(bitmap_git, &show_object_fast);
|
traverse_bitmap_commit_list(bitmap_git, &show_object_fast);
|
||||||
|
free_bitmap_index(bitmap_git);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,6 +367,10 @@ void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack)
|
|||||||
writer.reused = kh_init_sha1();
|
writer.reused = kh_init_sha1();
|
||||||
rebuild_existing_bitmaps(bitmap_git, to_pack, writer.reused,
|
rebuild_existing_bitmaps(bitmap_git, to_pack, writer.reused,
|
||||||
writer.show_progress);
|
writer.show_progress);
|
||||||
|
/*
|
||||||
|
* NEEDSWORK: rebuild_existing_bitmaps() makes writer.reused reference
|
||||||
|
* some bitmaps in bitmap_git, so we can't free the latter.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ewah_bitmap *find_reused_bitmap(const unsigned char *sha1)
|
static struct ewah_bitmap *find_reused_bitmap(const unsigned char *sha1)
|
||||||
|
@ -66,7 +66,7 @@ struct bitmap_index {
|
|||||||
/* Number of bitmapped commits */
|
/* Number of bitmapped commits */
|
||||||
uint32_t entry_count;
|
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;
|
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))
|
if (!open_pack_bitmap(bitmap_git) && !load_pack_bitmap(bitmap_git))
|
||||||
return bitmap_git;
|
return bitmap_git;
|
||||||
|
|
||||||
|
free_bitmap_index(bitmap_git);
|
||||||
return NULL;
|
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
|
/* try to open a bitmapped pack, but don't parse it yet
|
||||||
* because we may not need to use it */
|
* because we may not need to use it */
|
||||||
if (open_pack_bitmap(bitmap_git) < 0)
|
if (open_pack_bitmap(bitmap_git) < 0)
|
||||||
return NULL;
|
goto cleanup;
|
||||||
|
|
||||||
for (i = 0; i < revs->pending.nr; ++i) {
|
for (i = 0; i < revs->pending.nr; ++i) {
|
||||||
struct object *object = revs->pending.objects[i].item;
|
struct object *object = revs->pending.objects[i].item;
|
||||||
@ -723,11 +724,11 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
|
|||||||
* optimize here
|
* optimize here
|
||||||
*/
|
*/
|
||||||
if (haves && !in_bitmapped_pack(bitmap_git, haves))
|
if (haves && !in_bitmapped_pack(bitmap_git, haves))
|
||||||
return NULL;
|
goto cleanup;
|
||||||
|
|
||||||
/* if we don't want anything, we're done here */
|
/* if we don't want anything, we're done here */
|
||||||
if (!wants)
|
if (!wants)
|
||||||
return NULL;
|
goto cleanup;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* now we're going to use bitmaps, so load the actual bitmap entries
|
* 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
|
* becomes invalidated and we must perform the revwalk through bitmaps
|
||||||
*/
|
*/
|
||||||
if (!bitmap_git->loaded && load_pack_bitmap(bitmap_git) < 0)
|
if (!bitmap_git->loaded && load_pack_bitmap(bitmap_git) < 0)
|
||||||
return NULL;
|
goto cleanup;
|
||||||
|
|
||||||
object_array_clear(&revs->pending);
|
object_array_clear(&revs->pending);
|
||||||
|
|
||||||
@ -761,6 +762,10 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs)
|
|||||||
|
|
||||||
bitmap_free(haves_bitmap);
|
bitmap_free(haves_bitmap);
|
||||||
return bitmap_git;
|
return bitmap_git;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
free_bitmap_index(bitmap_git);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
int reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
|
||||||
@ -1001,7 +1006,7 @@ void test_bitmap_walk(struct rev_info *revs)
|
|||||||
else
|
else
|
||||||
fprintf(stderr, "Mismatch!\n");
|
fprintf(stderr, "Mismatch!\n");
|
||||||
|
|
||||||
bitmap_free(result);
|
free_bitmap_index(bitmap_git);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rebuild_bitmap(uint32_t *reposition,
|
static int rebuild_bitmap(uint32_t *reposition,
|
||||||
@ -1093,3 +1098,21 @@ int rebuild_existing_bitmaps(struct bitmap_index *bitmap_git,
|
|||||||
bitmap_free(rebuild);
|
bitmap_free(rebuild);
|
||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
@ -48,6 +48,7 @@ int reuse_partial_packfile_from_bitmap(struct bitmap_index *,
|
|||||||
uint32_t *entries, off_t *up_to);
|
uint32_t *entries, off_t *up_to);
|
||||||
int rebuild_existing_bitmaps(struct bitmap_index *, struct packing_data *mapping,
|
int rebuild_existing_bitmaps(struct bitmap_index *, struct packing_data *mapping,
|
||||||
khash_sha1 *reused_bitmaps, int show_progress);
|
khash_sha1 *reused_bitmaps, int show_progress);
|
||||||
|
void free_bitmap_index(struct bitmap_index *);
|
||||||
|
|
||||||
void bitmap_writer_show_progress(int show);
|
void bitmap_writer_show_progress(int show);
|
||||||
void bitmap_writer_set_checksum(unsigned char *sha1);
|
void bitmap_writer_set_checksum(unsigned char *sha1);
|
||||||
|
Loading…
Reference in New Issue
Block a user