]> Sergey Matveev's repositories - public-inbox.git/commitdiff
nntp: avoid signals for long responses
authorEric Wong <e@80x24.org>
Fri, 25 Sep 2015 02:27:57 +0000 (02:27 +0000)
committerEric Wong <e@80x24.org>
Fri, 25 Sep 2015 02:29:09 +0000 (02:29 +0000)
Using a signal-based timer can hurt throughput on a machine that's
overloaded.  Ensure there's always forward progress and reduce the
number of syscalls we make, too.

lib/PublicInbox/NNTP.pm

index 3490a09879ea4df021f7368c38c79df6edc5c693..95aa4af7b3917f14b7eff0f9524f5b80424d33aa 100644 (file)
@@ -11,7 +11,7 @@ use PublicInbox::MID qw(mid2path);
 use Email::MIME;
 use Data::Dumper qw(Dumper);
 use POSIX qw(strftime);
-use Time::HiRes qw(clock_gettime ualarm CLOCK_MONOTONIC);
+use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);
 use constant {
        r501 => '501 command syntax error',
        r221 => '221 Header follows',
@@ -502,16 +502,13 @@ sub long_response ($$$$) {
        $self->{long_res} = sub {
                # limit our own running time for fairness with other
                # clients and to avoid buffering too much:
-               my $yield;
-               local $SIG{ALRM} = sub { $yield = 1 };
-               ualarm(100000);
+               my $lim = 100;
 
                my $err;
                do {
                        eval { $cb->(\$beg) };
                } until (($err = $@) || $self->{closed} ||
-                        ++$beg > $end || $yield || $self->{write_buf_size});
-               ualarm(0);
+                        ++$beg > $end || !--$lim || $self->{write_buf_size});
 
                if ($err || $self->{closed}) {
                        $self->{long_res} = undef;
@@ -527,7 +524,7 @@ sub long_response ($$$$) {
                        } else {
                                $self->watch_read(1);
                        }
-               } elsif ($yield || $self->{write_buf_size}) {
+               } elsif (!$lim || $self->{write_buf_size}) {
                        # no recursion, schedule another call ASAP
                        # but only after all pending writes are done
                        Danga::Socket->AddTimer(0, sub {