summaryrefslogtreecommitdiff
path: root/revision.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2019-12-05 20:52:48 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-12-05 20:52:48 (GMT)
commitfd952307ec2a260b1ed668d56f1a4cf3569baee3 (patch)
tree6fd1fc0af208917e7e19ea6563c98f8004a73350 /revision.c
parente547e5a89e3641bae02e762bcb0062951bb698e5 (diff)
parent0aa0c2b2ec12c91a122aec7a8497fe3577529eba (diff)
downloadgit-fd952307ec2a260b1ed668d56f1a4cf3569baee3.zip
git-fd952307ec2a260b1ed668d56f1a4cf3569baee3.tar.gz
git-fd952307ec2a260b1ed668d56f1a4cf3569baee3.tar.bz2
Merge branch 'mh/clear-topo-walk-upon-reset'
The revision walking machinery uses resources like per-object flag bits that need to be reset before a new iteration of walking begins, but the resources related to topological walk were not cleared correctly, which has been corrected. * mh/clear-topo-walk-upon-reset: revision: free topo_walk_info before creating a new one in init_topo_walk revision: clear the topo-walk flags in reset_revision_walk
Diffstat (limited to 'revision.c')
-rw-r--r--revision.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/revision.c b/revision.c
index 0e39b2b..7e23c5e 100644
--- a/revision.c
+++ b/revision.c
@@ -3098,7 +3098,7 @@ static void set_children(struct rev_info *revs)
void reset_revision_walk(void)
{
- clear_object_flags(SEEN | ADDED | SHOWN);
+ clear_object_flags(SEEN | ADDED | SHOWN | TOPO_WALK_EXPLORED | TOPO_WALK_INDEGREE);
}
static int mark_uninteresting(const struct object_id *oid,
@@ -3211,10 +3211,26 @@ static void compute_indegrees_to_depth(struct rev_info *revs,
indegree_walk_step(revs);
}
+static void reset_topo_walk(struct rev_info *revs)
+{
+ struct topo_walk_info *info = revs->topo_walk_info;
+
+ clear_prio_queue(&info->explore_queue);
+ clear_prio_queue(&info->indegree_queue);
+ clear_prio_queue(&info->topo_queue);
+ clear_indegree_slab(&info->indegree);
+ clear_author_date_slab(&info->author_date);
+
+ FREE_AND_NULL(revs->topo_walk_info);
+}
+
static void init_topo_walk(struct rev_info *revs)
{
struct topo_walk_info *info;
struct commit_list *list;
+ if (revs->topo_walk_info)
+ reset_topo_walk(revs);
+
revs->topo_walk_info = xmalloc(sizeof(struct topo_walk_info));
info = revs->topo_walk_info;
memset(info, 0, sizeof(struct topo_walk_info));