[PATCH 2/2] revision: free topo_walk_info before creating a new one in init_topo_walk
- From
Mike Hommey <mh@glandium.org>
- Date
- Nov 22, 2019, 08:37 UTC
- Message-ID
- <20191122083704.29267-2-mh@glandium.org>
- In-Reply-To
- <20191122083704.29267-1-mh@glandium.org>
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 <mh@glandium.org> --- revision.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
The FREE_AND_NULL() -> xmalloc dance could be avoided, but I figured the function ought to be reused in the future to clear the rev_info. I was thinking to add a call in reset_revision_walk instead, but reset_revision_walk doesn't take an argument at all currently.
diff --git a/revision.c b/revision.c index 765a56ae33..7e23c5ed08 100644 --- a/revision.c +++ b/revision.c @@ -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));
-- 2.24.0.dirty