685
return 0;
686
}
687
688
+static void release_revisions_bloom_keyvecs(struct rev_info *revs);
689
+
690
static void prepare_to_use_bloom_filter(struct rev_info *revs)
691
{
692
struct pathspec_item *pi;
693
char *path_alloc = NULL;
692
- const char *path, *p;
694
+ const char *path;
695
size_t len;
694
- int path_component_nr = 1;
696
697
if (!revs->commits)
698
return;
709
if (!revs->pruning.pathspec.nr)
710
return;
711
712
+ revs->bloom_keyvecs_nr = 1;
713
+ CALLOC_ARRAY(revs->bloom_keyvecs, 1);
714
pi = &revs->pruning.pathspec.items[0];
715
716
/* remove single trailing slash from path, if needed */
721
path = pi->match;
722
723
len = strlen(path);
721
- if (!len) {
722
- revs->bloom_filter_settings = NULL;
723
- free(path_alloc);
724
- return;
725
- }
726
-
727
- p = path;
728
- while (*p) {
729
- /*
730
- * At this point, the path is normalized to use Unix-style
731
- * path separators. This is required due to how the
732
- * changed-path Bloom filters store the paths.
733
- */
734
- if (*p == '/')
735
- path_component_nr++;
736
- p++;
737
- }
738
-
739
- revs->bloom_keys_nr = path_component_nr;
740
- ALLOC_ARRAY(revs->bloom_keys, revs->bloom_keys_nr);
724
+ if (!len)
725
+ goto fail;
726
742
- bloom_key_fill(&revs->bloom_keys[0], path, len,
743
- revs->bloom_filter_settings);
744
- path_component_nr = 1;
745
-
746
- p = path + len - 1;
747
- while (p > path) {
748
- if (*p == '/')
749
- bloom_key_fill(&revs->bloom_keys[path_component_nr++],
750
- path, p - path,
751
- revs->bloom_filter_settings);
752
- p--;
753
- }
727
+ revs->bloom_keyvecs[0] =
728
+ bloom_keyvec_new(path, len, revs->bloom_filter_settings);
729
730
if (trace2_is_enabled() && !bloom_filter_atexit_registered) {
731
atexit(trace2_bloom_filter_statistics_atexit);
732
bloom_filter_atexit_registered = 1;
733
}
734
735
+ return;
736
+
737
+fail:
738
+ revs->bloom_filter_settings = NULL;
739
free(path_alloc);
740
+ release_revisions_bloom_keyvecs(revs);
741
}
742
743
static int check_maybe_different_in_bloom_filter(struct rev_info *revs,
744
struct commit *commit)
745
{
746
struct bloom_filter *filter;
767
- int result = 1, j;
747
+ int result = 0;
748
749
if (!revs->repo->objects->commit_graph)
750
return -1;
759
return -1;
760
}
761
782
- for (j = 0; result && j < revs->bloom_keys_nr; j++) {
783
- result = bloom_filter_contains(filter,
784
- &revs->bloom_keys[j],
785
- revs->bloom_filter_settings);
762
+ for (size_t nr = 0; !result && nr < revs->bloom_keyvecs_nr; nr++) {
763
+ result = bloom_filter_contains_vec(filter,
764
+ revs->bloom_keyvecs[nr],
765
+ revs->bloom_filter_settings);
766
}
767
768
if (result)
803
return REV_TREE_SAME;
804
}
805
826
- if (revs->bloom_keys_nr && !nth_parent) {
806
+ if (revs->bloom_keyvecs_nr && !nth_parent) {
807
bloom_ret = check_maybe_different_in_bloom_filter(revs, commit);
808
809
if (bloom_ret == 0)
830
if (!t1)
831
return 0;
832
853
- if (!nth_parent && revs->bloom_keys_nr) {
833
+ if (!nth_parent && revs->bloom_keyvecs_nr) {
834
bloom_ret = check_maybe_different_in_bloom_filter(revs, commit);
835
if (!bloom_ret)
836
return 1;
3180
3181
static void release_revisions_topo_walk_info(struct topo_walk_info *info);
3182
3183
+static void release_revisions_bloom_keyvecs(struct rev_info *revs)
3184
+{
3185
+ for (size_t nr = 0; nr < revs->bloom_keyvecs_nr; nr++)
3186
+ bloom_keyvec_free(revs->bloom_keyvecs[nr]);
3187
+ FREE_AND_NULL(revs->bloom_keyvecs);
3188
+ revs->bloom_keyvecs_nr = 0;
3189
+}
3190
+
3191
static void free_void_commit_list(void *list)
3192
{
3193
free_commit_list(list);
3216
clear_decoration(&revs->treesame, free);
3217
line_log_free(revs);
3218
oidset_clear(&revs->missing_commits);
3231
-
3232
- for (int i = 0; i < revs->bloom_keys_nr; i++)
3233
- bloom_key_clear(&revs->bloom_keys[i]);
3234
- FREE_AND_NULL(revs->bloom_keys);
3235
- revs->bloom_keys_nr = 0;
3219
+ release_revisions_bloom_keyvecs(revs);
3220
}
3221
3222
static void add_child(struct rev_info *revs, struct commit *parent, struct commit *child)