diff options
-rw-r--r-- | lib/PublicInbox/DS.pm | 11 | ||||
-rw-r--r-- | lib/PublicInbox/HTTP.pm | 6 | ||||
-rw-r--r-- | 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 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; } } |