From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 4A7222018C for ; Tue, 21 Jun 2016 03:12:03 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/7] view: remove recursion from thread skeleton dump Date: Tue, 21 Jun 2016 03:11:57 +0000 Message-Id: <20160621031201.28089-4-e@80x24.org> In-Reply-To: <20160621031201.28089-1-e@80x24.org> References: <20160621031201.28089-1-e@80x24.org> List-Id: This should help prevent OOM errors from arbitrarily deep threads and will make our streaming interface easier-to-implement. --- lib/PublicInbox/View.pm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index a1b45e9..e09fbd5 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -386,8 +386,12 @@ sub thread_skel { upfx => "$tpfx../", dst => $dst, }; - for (thread_results(load_results($sres))->rootset) { - skel_dump($state, $_, 0); + my @q = map { (0, $_) } thread_results(load_results($sres))->rootset; + while (@q) { + my $level = shift @q; + my $node = shift @q or next; + skel_dump($state, $level, $node); + unshift @q, $level+1, $node->child, $level, $node->next; } $ctx->{next_msg} = $state->{next_msg}; $ctx->{parent_msg} = $parent; @@ -714,8 +718,7 @@ sub _skel_header { } sub skel_dump { - my ($state, $node, $level) = @_; - return unless $node; + my ($state, $level, $node) = @_; if (my $mime = $node->message) { my $hdr = $mime->header_obj; my $mid = mid_clean($hdr->header_raw('Message-ID')); @@ -734,8 +737,6 @@ sub skel_dump { $$dst .= qq{<$html>\n}; } } - skel_dump($state, $node->child, $level+1); - skel_dump($state, $node->next, $level); } sub sort_ts {