From: Eric Wong Date: Wed, 4 Jan 2017 11:20:51 +0000 (+0000) Subject: http: remove weaken usage, reduce anonsub capture scope X-Git-Tag: v1.0.0~107 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=f62f27ddd89720215e929af4ead2f97b750664b6;p=public-inbox.git http: remove weaken usage, reduce anonsub capture scope 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. --- diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 03ce4fe5..3530f8ba 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: