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,AWL,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 40E8D209A5 for ; Wed, 4 Jan 2017 11:20:55 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/3] http: remove weaken usage, reduce anonsub capture scope Date: Wed, 4 Jan 2017 11:20:51 +0000 Message-Id: <20170104112051.6804-4-e@80x24.org> In-Reply-To: <20170104112051.6804-1-e@80x24.org> References: <20170104112051.6804-1-e@80x24.org> List-Id: Avoiding weaken here is no more dangerous than the existing circular refs (e.g. psgix.io) we create and manage throughout the lifetime of the connection. So, trust ourselves to maintain the data structure properly and avoid triggering extra memory usage. While we're at it, avoid having anonymous subroutines capture more variables than necessary to simplify reference auditing. --- lib/PublicInbox/HTTP.pm | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 03ce4fe..3530f8b 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -16,7 +16,6 @@ use Fcntl qw(:seek); use Plack::HTTPParser qw(parse_http_request); # XS or pure Perl use HTTP::Status qw(status_message); use HTTP::Date qw(time2str); -use Scalar::Util qw(weaken); use IO::Handle; use constant { CHUNK_START => -1, # [a-f0-9]+\r\n @@ -237,12 +236,14 @@ sub next_request ($) { } } -sub response_done ($$) { +sub response_done_cb ($$) { my ($self, $alive) = @_; - my $env = $self->{env}; - $self->{env} = undef; - $self->write("0\r\n\r\n") if $alive == 2; - $self->write(sub { $alive ? next_request($self) : $self->close }); + sub { + my $env = $self->{env}; + $self->{env} = undef; + $self->write("0\r\n\r\n") if $alive == 2; + $self->write(sub{$alive ? next_request($self) : $self->close}); + } } sub getline_cb ($$$) { @@ -283,10 +284,8 @@ sub getline_cb ($$$) { $close->(); } -sub getline_response { - my ($self, $body, $write, $close) = @_; - $self->{forward} = $body; - weaken($self); +sub getline_response ($$$) { + my ($self, $write, $close) = @_; my $pull = $self->{pull} = sub { getline_cb($self, $write, $close) }; $pull->(); } @@ -294,15 +293,15 @@ sub getline_response { sub response_write { my ($self, $env, $res) = @_; my $alive = response_header_write($self, $env, $res); - + my $close = response_done_cb($self, $alive); my $write = $alive == 2 ? chunked_wcb($self) : identity_wcb($self); - my $close = sub { response_done($self, $alive) }; if (defined(my $body = $res->[2])) { if (ref $body eq 'ARRAY') { $write->($_) foreach @$body; $close->(); } else { - getline_response($self, $body, $write, $close); + $self->{forward} = $body; + getline_response($self, $write, $close); } } else { # this is returned to the calling application: -- EW