From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 54D701F4BD for ; Mon, 24 Jun 2019 02:54:17 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 17/57] ds: set event flags directly at initialization Date: Mon, 24 Jun 2019 02:52:18 +0000 Message-Id: <20190624025258.25592-18-e@80x24.org> In-Reply-To: <20190624025258.25592-1-e@80x24.org> References: <20190624025258.25592-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We can avoid the EPOLL_CTL_ADD && EPOLL_CTL_MOD sequence with a single EPOLL_CTL_ADD. --- lib/PublicInbox/DS.pm | 23 ++++++++++------------- lib/PublicInbox/EvCleanup.pm | 2 +- lib/PublicInbox/HTTP.pm | 3 +-- lib/PublicInbox/HTTPD/Async.pm | 3 +-- lib/PublicInbox/Listener.pm | 4 ++-- lib/PublicInbox/NNTP.pm | 3 +-- lib/PublicInbox/ParentPipe.pm | 3 +-- 7 files changed, 17 insertions(+), 24 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index bff12de5..2e0aa1e0 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -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})") diff --git a/lib/PublicInbox/EvCleanup.pm b/lib/PublicInbox/EvCleanup.pm index bd4dda11..d60ac2cc 100644 --- a/lib/PublicInbox/EvCleanup.pm +++ b/lib/PublicInbox/EvCleanup.pm @@ -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 diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index fcb5eb6c..afa71ea5 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -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; } diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 46ea188c..dae62e55 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -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; } diff --git a/lib/PublicInbox/Listener.pm b/lib/PublicInbox/Listener.pm index 6ee3abb1..94b2aed4 100644 --- a/lib/PublicInbox/Listener.pm +++ b/lib/PublicInbox/Listener.pm @@ -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 } diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index fe01627f..eb1679a7 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -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; diff --git a/lib/PublicInbox/ParentPipe.pm b/lib/PublicInbox/ParentPipe.pm index a9f05fc1..ccc0815e 100644 --- a/lib/PublicInbox/ParentPipe.pm +++ b/lib/PublicInbox/ParentPipe.pm @@ -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; } -- EW