about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-01-12 21:17:51 +0000
committerEric Wong <e@yhbt.net>2020-01-13 23:21:25 +0000
commita65ebdc3a1f064bab0cddf64b34caad49f1c4c9c (patch)
tree2f3dea59884e4d6ee37393abd5f3a901593f4b79 /lib/PublicInbox
parent8f23c134b6c9bfc9f23b3eed7811082e6d33a84c (diff)
downloadpublic-inbox-a65ebdc3a1f064bab0cddf64b34caad49f1c4c9c.tar.gz
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.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/DS.pm11
-rw-r--r--lib/PublicInbox/HTTP.pm6
-rw-r--r--lib/PublicInbox/NNTP.pm11
3 files changed, 13 insertions, 15 deletions
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index d0aefec0..f7c8ad2b 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 071251c6..32537153 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;
         }
 }