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
);
# 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;
}
}
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;
}
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;
}
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;
}
}
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 ($@) {
# 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;
}
}