From f41dc46f6213661ba51443d6cb0d6a9ba4d41472 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 24 Jun 2019 02:52:18 +0000 Subject: ds: set event flags directly at initialization We can avoid the EPOLL_CTL_ADD && EPOLL_CTL_MOD sequence with a single EPOLL_CTL_ADD. --- lib/PublicInbox/DS.pm | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'lib/PublicInbox/DS.pm') 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})") -- cgit v1.2.3-24-ge0c7