]> Sergey Matveev's repositories - public-inbox.git/commitdiff
ds: set event flags directly at initialization
authorEric Wong <e@80x24.org>
Mon, 24 Jun 2019 02:52:18 +0000 (02:52 +0000)
committerEric Wong <e@80x24.org>
Mon, 24 Jun 2019 05:26:26 +0000 (05:26 +0000)
We can avoid the EPOLL_CTL_ADD && EPOLL_CTL_MOD sequence with
a single EPOLL_CTL_ADD.

lib/PublicInbox/DS.pm
lib/PublicInbox/EvCleanup.pm
lib/PublicInbox/HTTP.pm
lib/PublicInbox/HTTPD/Async.pm
lib/PublicInbox/Listener.pm
lib/PublicInbox/NNTP.pm
lib/PublicInbox/ParentPipe.pm

index bff12de51da8c3d81ede72efef89cd081fcd57d4..2e0aa1e042b7ab2e50dd44a7e3b974de82cdc749 100644 (file)
@@ -55,8 +55,6 @@ our (
      @Timers,                    # timers
      );
 
-# this may be set to zero with old kernels
-our $EPOLLEXCLUSIVE = EPOLLEXCLUSIVE;
 Reset();
 
 #####################################################################
@@ -389,7 +387,7 @@ This is normally (always?) called from your subclass via:
 
 =cut
 sub new {
-    my ($self, $sock, $exclusive) = @_;
+    my ($self, $sock, $ev) = @_;
     $self = fields::new($self) unless ref $self;
 
     $self->{sock} = $sock;
@@ -398,30 +396,29 @@ sub new {
     Carp::cluck("undef sock and/or fd in PublicInbox::DS->new.  sock=" . ($sock || "") . ", fd=" . ($fd || ""))
         unless $sock && $fd;
 
-    my $ev = $self->{event_watch} = 0;
+    $self->{event_watch} = $ev;
 
     _InitPoller();
 
     if ($HaveEpoll) {
-        if ($exclusive) {
-            $ev = $self->{event_watch} = EPOLLIN|$EPOLLEXCLUSIVE;
-        }
 retry:
         if (epoll_ctl($Epoll, EPOLL_CTL_ADD, $fd, $ev)) {
-            if ($! == EINVAL && ($ev & $EPOLLEXCLUSIVE)) {
-                $EPOLLEXCLUSIVE = 0; # old kernel
-                $ev = $self->{event_watch} = EPOLLIN;
+            if ($! == EINVAL && ($ev & EPOLLEXCLUSIVE)) {
+                $self->{event_watch} = ($ev &= ~EPOLLEXCLUSIVE);
                 goto retry;
             }
             die "couldn't add epoll watch for $fd: $!\n";
         }
     }
     elsif ($HaveKQueue) {
-        # Add them to the queue but disabled for now
+        my $f = $ev & EPOLLIN ? IO::KQueue::EV_ENABLE()
+                              : IO::KQueue::EV_DISABLE();
         $KQueue->EV_SET($fd, IO::KQueue::EVFILT_READ(),
-                        IO::KQueue::EV_ADD() | IO::KQueue::EV_DISABLE());
+                        IO::KQueue::EV_ADD() | $f);
+        $f = $ev & EPOLLOUT ? IO::KQueue::EV_ENABLE()
+                            : IO::KQueue::EV_DISABLE();
         $KQueue->EV_SET($fd, IO::KQueue::EVFILT_WRITE(),
-                        IO::KQueue::EV_ADD() | IO::KQueue::EV_DISABLE());
+                        IO::KQueue::EV_ADD() | $f);
     }
 
     Carp::cluck("PublicInbox::DS::new blowing away existing descriptor map for fd=$fd ($DescriptorMap{$fd})")
index bd4dda117192f9dfa107070fff63890fea8cf1c9..d60ac2cc8c88d3de63288c2d51d517b796e65c1d 100644 (file)
@@ -23,7 +23,7 @@ sub once_init () {
        # fires in the next event loop iteration.
        pipe($r, $w) or die "pipe: $!";
        fcntl($w, 1031, 4096) if $^O eq 'linux'; # 1031: F_SETPIPE_SZ
-       $self->SUPER::new($w);
+       $self->SUPER::new($w, 0);
 
        # always writable, since PublicInbox::EvCleanup::event_step
        # never drains wbuf.  We can avoid wasting a hash slot by
index fcb5eb6c6342e7b1725263f4ab3ae3c3c60dd021..afa71ea53f3cb3ddda35d96a11117b104ead6dc8 100644 (file)
@@ -56,12 +56,11 @@ sub http_date () {
 sub new ($$$) {
        my ($class, $sock, $addr, $httpd) = @_;
        my $self = fields::new($class);
-       $self->SUPER::new($sock);
+       $self->SUPER::new($sock, PublicInbox::DS::EPOLLIN());
        $self->{httpd} = $httpd;
        $self->{rbuf} = '';
        ($self->{remote_addr}, $self->{remote_port}) =
                PublicInbox::Daemon::host_with_port($addr);
-       $self->watch_read(1);
        $self;
 }
 
index 46ea188c0127c8a0791015b1d475861f6aff9a39..dae62e555957fa707f6dfa62978c5f9d932f3702 100644 (file)
@@ -25,10 +25,9 @@ sub new {
 
        my $self = fields::new($class);
        IO::Handle::blocking($io, 0);
-       $self->SUPER::new($io);
+       $self->SUPER::new($io, PublicInbox::DS::EPOLLIN());
        $self->{cb} = $cb;
        $self->{cleanup} = $cleanup;
-       $self->watch_read(1);
        $self;
 }
 
index 6ee3abb1e27bed242d84ca069e827025e8370e15..94b2aed4db632c597eac684057e26264f80859eb 100644 (file)
@@ -17,8 +17,8 @@ sub new ($$$) {
        listen($s, 1024);
        IO::Handle::blocking($s, 0);
        my $self = fields::new($class);
-       $self->SUPER::new($s, 1); # calls epoll_create for the first socket
-       $self->watch_read(1);
+       $self->SUPER::new($s, PublicInbox::DS::EPOLLIN()|
+                             PublicInbox::DS::EPOLLEXCLUSIVE());
        $self->{post_accept} = $cb;
        $self
 }
index fe01627ff33cb330deccaa0d334b0a373a08aecc..eb1679a76b32072a740f4959829cb0b989dcce01 100644 (file)
@@ -97,11 +97,10 @@ sub expire_old () {
 sub new ($$$) {
        my ($class, $sock, $nntpd) = @_;
        my $self = fields::new($class);
-       $self->SUPER::new($sock);
+       $self->SUPER::new($sock, PublicInbox::DS::EPOLLIN());
        $self->{nntpd} = $nntpd;
        res($self, '201 ' . $nntpd->{servername} . ' ready - post via email');
        $self->{rbuf} = '';
-       $self->watch_read(1);
        update_idle_time($self);
        $expt ||= PublicInbox::EvCleanup::later(*expire_old);
        $self;
index a9f05fc14a9fa86f7b4c18868b13ef4f7bba6e7c..ccc0815ea46d5400ba591d2457aba220a9b2c2f1 100644 (file)
@@ -10,9 +10,8 @@ use fields qw(cb);
 sub new ($$$) {
        my ($class, $pipe, $cb) = @_;
        my $self = fields::new($class);
-       $self->SUPER::new($pipe);
+       $self->SUPER::new($pipe, PublicInbox::DS::EPOLLIN());
        $self->{cb} = $cb;
-       $self->watch_read(1);
        $self;
 }