From 950be11b15dcd1edee98caec80b445471971a55f Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 4 Jan 2017 11:20:50 +0000 Subject: httpd/async: remove weaken usage We do not need to use weaken() here, so avoid it to simplify our interactions with Perl; as weaken requires additional storage and (it seems) time complexity. --- lib/PublicInbox/HTTPD/Async.pm | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'lib/PublicInbox/HTTPD') diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 79951ca6..54b62451 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -10,7 +10,6 @@ use strict; use warnings; use base qw(Danga::Socket); use fields qw(cb cleanup); -use Scalar::Util qw(weaken); require PublicInbox::EvCleanup; sub new { @@ -29,22 +28,17 @@ sub restart_read_cb ($) { sub { $self->watch_read(1) } } -sub async_pass { - my ($self, $http, $fh, $bref) = @_; - # In case the client HTTP connection ($http) dies, it - # will automatically close this ($self) object. - $http->{forward} = $self; - $fh->write($$bref); - my $restart_read = restart_read_cb($self); - weaken($self); - $self->{cb} = sub { +sub main_cb ($$$) { + my ($http, $fh, $bref) = @_; + sub { + my ($self) = @_; my $r = sysread($self->{sock}, $$bref, 8192); if ($r) { $fh->write($$bref); return if $http->{closed}; if ($http->{write_buf_size}) { $self->watch_read(0); - $http->write($restart_read); # D::S::write + $http->write(restart_read_cb($self)); } # stay in watch_read, but let other clients # get some work done, too. @@ -60,9 +54,18 @@ sub async_pass { } } -sub event_read { $_[0]->{cb}->() } -sub event_hup { $_[0]->{cb}->() } -sub event_err { $_[0]->{cb}->() } +sub async_pass { + my ($self, $http, $fh, $bref) = @_; + # In case the client HTTP connection ($http) dies, it + # will automatically close this ($self) object. + $http->{forward} = $self; + $fh->write($$bref); # PublicInbox:HTTP::{chunked,identity}_wcb + $self->{cb} = main_cb($http, $fh, $bref); +} + +sub event_read { $_[0]->{cb}->(@_) } +sub event_hup { $_[0]->{cb}->(@_) } +sub event_err { $_[0]->{cb}->(@_) } sub sysread { shift->{sock}->sysread(@_) } sub close { -- cgit v1.2.3-24-ge0c7