From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.1 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_NONE shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by dcvr.yhbt.net (Postfix) with ESMTP id 5337C1F463 for ; Fri, 22 Nov 2019 08:54:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727130AbfKVIya (ORCPT ); Fri, 22 Nov 2019 03:54:30 -0500 Received: from ns332406.ip-37-187-123.eu ([37.187.123.207]:34192 "EHLO glandium.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726546AbfKVIya (ORCPT ); Fri, 22 Nov 2019 03:54:30 -0500 X-Greylist: delayed 1041 seconds by postgrey-1.27 at vger.kernel.org; Fri, 22 Nov 2019 03:54:29 EST Received: from glandium by mitsuha.glandium.org with local (Exim 4.92.3) (envelope-from ) id 1iY4R6-0007cs-Iu; Fri, 22 Nov 2019 17:37:04 +0900 From: Mike Hommey To: git@vger.kernel.org Cc: gitster@pobox.com Subject: [PATCH 2/2] revision: free topo_walk_info before creating a new one in init_topo_walk Date: Fri, 22 Nov 2019 17:37:04 +0900 Message-Id: <20191122083704.29267-2-mh@glandium.org> X-Mailer: git-send-email 2.24.0.dirty In-Reply-To: <20191122083704.29267-1-mh@glandium.org> References: <20191122083704.29267-1-mh@glandium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.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 --- 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