From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id E84581FD55 for ; Sun, 12 Jan 2020 21:17:57 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 06/11] ds|http|nntp: simplify {wbuf} population Date: Sun, 12 Jan 2020 21:17:51 +0000 Message-Id: <20200112211756.23100-7-e@yhbt.net> In-Reply-To: <20200112211756.23100-1-e@yhbt.net> References: <20200112211756.23100-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We can rely on autovification to turn `undef' value of {wbuf} into an arrayref. Furthermore, "push" returns the (new) size of the array since at least Perl 5.0 (I didn't look further back), so we can use that return value instead of calling "scalar" again. --- lib/PublicInbox/DS.pm | 11 +++++------ lib/PublicInbox/HTTP.pm | 6 +++--- lib/PublicInbox/NNTP.pm | 11 +++++------ 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index 52b11386..7a4aa7cc 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -31,7 +31,7 @@ use PublicInbox::Tmpfile; use fields ('sock', # underlying socket 'rbuf', # scalarref, usually undef - 'wbuf', # arrayref of coderefs or GLOB refs + 'wbuf', # arrayref of coderefs or GLOB refs (autovivified) 'wbuf_off', # offset into first element of wbuf to start writing at ); @@ -555,7 +555,7 @@ sub write { # wbuf may be an empty array if we're being called inside # ->flush_write via CODE bref: - push @{$self->{wbuf} ||= []}, $tmpio; + push @{$self->{wbuf}}, $tmpio; # autovivifies return 0; } } @@ -575,8 +575,7 @@ sub msg_more ($$) { return 1 if $nlen == 0; # all done! # queue up the unwritten substring: my $tmpio = tmpio($self, \($_[1]), $n) or return 0; - $self->{wbuf} //= $wbuf //= []; - push @$wbuf, $tmpio; + push @{$self->{wbuf}}, $tmpio; # autovivifies epwait($sock, EPOLLOUT|EPOLLONESHOT); return 0; } @@ -599,7 +598,7 @@ sub accept_tls_step ($) { return 1 if $sock->accept_SSL; return $self->close if $! != EAGAIN; epwait($sock, PublicInbox::TLS::epollbit() | EPOLLONESHOT); - unshift @{$self->{wbuf} ||= []}, \&accept_tls_step; + unshift(@{$self->{wbuf}}, \&accept_tls_step); # autovivifies 0; } @@ -610,7 +609,7 @@ sub shutdn_tls_step ($) { return $self->close if $sock->stop_SSL(SSL_fast_shutdown => 1); return $self->close if $! != EAGAIN; epwait($sock, PublicInbox::TLS::epollbit() | EPOLLONESHOT); - unshift @{$self->{wbuf} ||= []}, \&shutdn_tls_step; + unshift(@{$self->{wbuf}}, \&shutdn_tls_step); # autovivifies 0; } diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index a6ec1d0d..5fecf292 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -280,12 +280,12 @@ sub getline_pull { } if ($self->{sock}) { - my $wbuf = $self->{wbuf} //= []; - push @$wbuf, \&getline_pull; + # autovivify wbuf + my $new_size = push(@{$self->{wbuf}}, \&getline_pull); # wbuf may be populated by {chunked,identity}_write() # above, no need to rearm if so: - $self->requeue if scalar(@$wbuf) == 1; + $self->requeue if $new_size == 1; return; # likely } } elsif ($@) { diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 9f0dfaaa..35729f00 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -616,20 +616,19 @@ sub long_step { # each other's data $self->zflush; - # no recursion, schedule another call ASAP - # but only after all pending writes are done - my $wbuf = $self->{wbuf} ||= []; - push @$wbuf, \&long_step; + # no recursion, schedule another call ASAP, but only after + # all pending writes are done. autovivify wbuf: + my $new_size = push(@{$self->{wbuf}}, \&long_step); # wbuf may be populated by $cb, no need to rearm if so: - $self->requeue if scalar(@$wbuf) == 1; + $self->requeue if $new_size == 1; } else { # all done! delete $self->{long_cb}; res($self, '.'); my $elapsed = now() - $t0; my $fd = fileno($self->{sock}); out($self, " deferred[$fd] done - %0.6f", $elapsed); - my $wbuf = $self->{wbuf}; + my $wbuf = $self->{wbuf}; # do NOT autovivify $self->requeue unless $wbuf && @$wbuf; } }