diff options
author | Eric Wong <e@80x24.org> | 2021-10-23 18:20:44 -0600 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-10-24 02:20:33 +0000 |
commit | 08b543eb6c67cc19ea8e86afe6b9494df79e2fea (patch) | |
tree | 12178b7b3dd008b630d31175f3e6684202397e1e /lib/PublicInbox/SearchThread.pm | |
parent | a877fe97c753e7dc1803936e932adff566f7641d (diff) | |
download | public-inbox-08b543eb6c67cc19ea8e86afe6b9494df79e2fea.tar.gz |
The use of array-returning built-ins such as `grep' inside arrayref declarations appears to result in permanently allocated scratchpad space for caching according to my malloc inspector. Thread skeletons get discarded every response, but multiple skeletons can exist in memory at once, so do what we can to prevent long-lived allocations from being made, here. In other words, replacing constructs such as: my $foo = [ grep(...) ]; with: my @foo = grep(...); Seems to ensure the mortality of the underlying array.
Diffstat (limited to 'lib/PublicInbox/SearchThread.pm')
-rw-r--r-- | lib/PublicInbox/SearchThread.pm | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm index 507f25ba..f07dd696 100644 --- a/lib/PublicInbox/SearchThread.pm +++ b/lib/PublicInbox/SearchThread.pm @@ -83,15 +83,15 @@ sub thread { } } my $ibx = $ctx->{ibx}; - my $rootset = [ grep { # n.b.: delete prevents cyclic refs + my @rootset = grep { # n.b.: delete prevents cyclic refs !delete($_->{parent}) && $_->visible($ibx) - } values %id_table ]; - $rootset = $ordersub->($rootset); - $_->order_children($ordersub, $ctx) for @$rootset; + } values %id_table; + $ordersub->(\@rootset); + $_->order_children($ordersub, $ctx) for @rootset; # parent imposter messages with reused Message-IDs unshift(@{$id_table{$_->{mid}}->{children}}, $_) for @imposters; - $rootset; + \@rootset; } package PublicInbox::SearchThread::Msg; @@ -172,12 +172,12 @@ sub order_children { my @q = ($cur); my $ibx = $ctx->{ibx}; while (defined($cur = shift @q)) { - my $c = $cur->{children}; # The hashref here... - - $c = [ grep { !$seen{$_}++ && visible($_, $ibx) } values %$c ]; - $c = $ordersub->($c) if scalar @$c > 1; - $cur->{children} = $c; # ...becomes an arrayref - push @q, @$c; + # the {children} hashref here... + my @c = grep { !$seen{$_}++ && visible($_, $ibx) } + values %{$cur->{children}}; + $ordersub->(\@c) if scalar(@c) > 1; + $cur->{children} = \@c; # ...becomes an arrayref + push @q, @c; } } |