From 8cb2a4307b20868266c838fc940bc8a57bca968a Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 12 Jan 2020 21:17:56 +0000 Subject: sigfd: simplify loop and improve documentation We can use the return value of sysread to bound our loop instead of repeatedly shortening the string. Furthermore add some comments which can be easily checked against the signalfd(2) manpage. --- lib/PublicInbox/Sigfd.pm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/Sigfd.pm b/lib/PublicInbox/Sigfd.pm index ec5d7145..15dedb10 100644 --- a/lib/PublicInbox/Sigfd.pm +++ b/lib/PublicInbox/Sigfd.pm @@ -42,14 +42,15 @@ sub new { # PublicInbox::Daemon in master main loop (blocking) sub wait_once ($) { my ($self) = @_; + # 128 == sizeof(struct signalfd_siginfo) my $r = sysread($self->{sock}, my $buf, 128 * 64); if (defined($r)) { - while (1) { - my $sig = unpack('L', $buf); - my $cb = $self->{sig}->{$sig}; - $cb->($sig) if $cb ne 'IGNORE'; - return $r if length($buf) == 128; - $buf = substr($buf, 128); + my $nr = $r / 128 - 1; # $nr may be -1 + for my $off (0..$nr) { + # the first uint32_t of signalfd_siginfo: ssi_signo + my $signo = unpack('L', substr($buf, 128 * $off, 4)); + my $cb = $self->{sig}->{$signo}; + $cb->($signo) if $cb ne 'IGNORE'; } } $r; -- cgit v1.2.3-24-ge0c7