From ffa1f28fea000312ac917874db40f7b298458ef5 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Fri, 22 Nov 2019 17:37:03 +0900 Subject: [PATCH 1/2] revision: clear the topo-walk flags in reset_revision_walk Not doing so can lead to wrong topo-walks when using the revision walk API consecutively. Signed-off-by: Mike Hommey Signed-off-by: Junio C Hamano --- revision.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/revision.c b/revision.c index 07412297f0..4827360ed8 100644 --- a/revision.c +++ b/revision.c @@ -3088,7 +3088,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, From 0aa0c2b2ec12c91a122aec7a8497fe3577529eba Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Fri, 22 Nov 2019 17:37:04 +0900 Subject: [PATCH 2/2] revision: free topo_walk_info before creating a new one in init_topo_walk init_topo_walk doesn't reuse an existing topo_walk_info, and currently leaks the one that might exist on the current rev_info if it was already used for a topo walk beforehand. Signed-off-by: Mike Hommey Signed-off-by: Junio C Hamano --- revision.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/revision.c b/revision.c index 4827360ed8..fb93c993a4 100644 --- a/revision.c +++ b/revision.c @@ -3201,10 +3201,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));