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 0E7D320968 for ; Wed, 4 Jan 2017 11:20:55 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/3] httpd/async: remove weaken usage Date: Wed, 4 Jan 2017 11:20:50 +0000 Message-Id: <20170104112051.6804-3-e@80x24.org> In-Reply-To: <20170104112051.6804-1-e@80x24.org> References: <20170104112051.6804-1-e@80x24.org> List-Id: 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(-) diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 79951ca..54b6245 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 { -- EW