use PublicInbox::Syscall qw(:epoll);
use PublicInbox::Tmpfile;
use Errno qw(EAGAIN EINVAL);
-use Carp qw(confess carp);
-our @EXPORT_OK = qw(now msg_more dwaitpid);
+use Carp qw(carp);
+our @EXPORT_OK = qw(now msg_more dwaitpid add_timer);
my $nextq; # queue for next_tick
my $wait_pids; # list of [ pid, callback, callback_arg ]
are not guaranteed to fire at the exact time you ask for.
=cut
-sub add_timer ($$;$) {
- my ($secs, $coderef, $arg) = @_;
+sub add_timer ($$;@) {
+ my ($secs, $coderef, @args) = @_;
my $fire_time = now() + $secs;
- my $timer = [$fire_time, $coderef, $arg];
+ my $timer = [$fire_time, $coderef, @args];
if (!@Timers || $fire_time >= $Timers[-1][0]) {
push @Timers, $timer;
sub next_tick () {
my $q = $nextq or return;
$nextq = undef;
- for (@$q) {
+ for my $obj (@$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
- if (blessed($_)) {
- $_->event_step;
+ if (blessed($obj)) {
+ $obj->event_step;
} else {
- $_->();
+ $obj->();
}
}
}
# Run expired timers
while (@Timers && $Timers[0][0] <= $now) {
my $to_run = shift(@Timers);
- $to_run->[1]->($to_run->[2]);
+ $to_run->[1]->(@$to_run[2..$#$to_run]);
}
# timers may enqueue into nextq:
$ev &= ~EPOLLEXCLUSIVE;
goto retry;
}
- die "couldn't add epoll watch for $fd: $!\n";
+ die "EPOLL_CTL_ADD $self/$sock/$fd: $!";
}
- confess("DescriptorMap{$fd} defined ($DescriptorMap{$fd})")
+ croak("FD:$fd in use by $DescriptorMap{$fd} (for $self/$sock)")
if defined($DescriptorMap{$fd});
$DescriptorMap{$fd} = $self;
# notifications about it
my $fd = fileno($sock);
epoll_ctl($Epoll, EPOLL_CTL_DEL, $fd, 0) and
- confess("EPOLL_CTL_DEL: $!");
+ croak("EPOLL_CTL_DEL($self/$sock): $!");
# we explicitly don't delete from DescriptorMap here until we
# actually close the socket, as we might be in the middle of
sub epwait ($$) {
my ($sock, $ev) = @_;
epoll_ctl($Epoll, EPOLL_CTL_MOD, fileno($sock), $ev) and
- confess("EPOLL_CTL_MOD $!");
+ croak("EPOLL_CTL_MOD($sock): $!");
}
# return true if complete, false if incomplete (or failure)