diff options
author | Eric Wong <e@80x24.org> | 2016-06-21 02:58:54 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-06-21 03:06:55 +0000 |
commit | 1714e84586b23265cc7814158cb75a51f74b726c (patch) | |
tree | bf71612ece1bc063a372753bab39ad4ad9b323ef /lib | |
parent | 30a4fadcc687d4e4e17dd4bfa0eb01f6f3595b7a (diff) | |
download | public-inbox-1714e84586b23265cc7814158cb75a51f74b726c.tar.gz |
This should help prevent OOM errors from arbitrarily deep threads and will make our streaming interface easier-to-implement.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/PublicInbox/View.pm | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index a1b45e90..e09fbd51 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{<<a\nhref="$href">$html</a>>\n}; } } - skel_dump($state, $node->child, $level+1); - skel_dump($state, $node->next, $level); } sub sort_ts { |