From: Eric Wong Date: Sun, 12 Jan 2020 21:17:56 +0000 (+0000) Subject: sigfd: simplify loop and improve documentation X-Git-Tag: v1.3.0~92 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=8cb2a4307b20868266c838fc940bc8a57bca968a;p=public-inbox.git 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. --- 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;