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
);
=cut
sub Reset {
%DescriptorMap = ();
- $nextq = [];
$WaitPids = [];
$later_queue = [];
$EXPMAP = {};
- $ToClose = $reap_timer = $later_timer = $exp_timer = undef;
+ $nextq = $ToClose = $reap_timer = $later_timer = $exp_timer = undef;
$LoopTimeout = -1; # no timeout by default
@Timers = ();
sub now () { clock_gettime(CLOCK_MONOTONIC) }
sub next_tick () {
- my $q = $nextq;
- $nextq = [];
+ my $q = $nextq or return;
+ $nextq = undef;
for (@$q) {
# we avoid "ref" on blessed refs to workaround a Perl 5.16.3 leak:
# https://rt.perl.org/Public/Bug/Display.html?id=114340
sub RunTimers {
next_tick();
- return ((@$nextq || $ToClose) ? 0 : $LoopTimeout) unless @Timers;
+ return (($nextq || $ToClose) ? 0 : $LoopTimeout) unless @Timers;
my $now = now();
}
# timers may enqueue into nextq:
- return 0 if (@$nextq || $ToClose);
+ return 0 if ($nextq || $ToClose);
return $LoopTimeout unless @Timers;
}
# reentrant SIGCHLD handler (since reap_pids is not reentrant)
-sub enqueue_reap ($) { push @$nextq, \&reap_pids };
+sub enqueue_reap ($) { push @$nextq, \&reap_pids }; # autovivifies
sub in_loop () { $in_loop }
### I N S T A N C E M E T H O D S
#####################################################################
-sub requeue ($) { push @$nextq, $_[0] }
+sub requeue ($) { push @$nextq, $_[0] } # autovivifies
=head2 C<< $obj->close >>
# 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;
}