]> Sergey Matveev's repositories - public-inbox.git/commitdiff
sigfd: simplify loop and improve documentation
authorEric Wong <e@yhbt.net>
Sun, 12 Jan 2020 21:17:56 +0000 (21:17 +0000)
committerEric Wong <e@yhbt.net>
Mon, 13 Jan 2020 23:21:32 +0000 (23:21 +0000)
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

index ec5d7145c1d2bdf27c14ce862f3b86bb07d82f53..15dedb1038af69ff83381aa235aa3bda73a70c44 100644 (file)
@@ -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;