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 691351FC0C for ; Fri, 1 Oct 2021 09:54:46 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 8/9] ds: inline set_cloexec Date: Fri, 1 Oct 2021 09:54:44 +0000 Message-Id: <20211001095445.9326-9-e@80x24.org> In-Reply-To: <20211001095445.9326-1-e@80x24.org> References: <20211001095445.9326-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: I'm thinking we can drop support for Linux <2.6.27 soonish and just use EPOLL_CLOEXEC. Perl without signalfd (or EVFILT_SIGNAL) is miserable, actually. --- lib/PublicInbox/DS.pm | 46 ++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index ba6c74d0ea97..debb777a27e8 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -44,7 +44,7 @@ my $ToClose; # sockets to close when event loop is done our ( %DescriptorMap, # fd (num) -> PublicInbox::DS object $Epoll, # Global epoll fd (or DSKQXS ref) - $_io, # IO::Handle for Epoll + $ep_io, # IO::Handle for Epoll $PostLoopCallback, # subref to call at the end of each loop, if defined (global) @@ -78,7 +78,7 @@ sub Reset { for my $q (@q) { @$q = () } $EXPMAP = undef; $wait_pids = $nextq = $ToClose = undef; - $_io = undef; # closes real $Epoll FD + $ep_io = undef; # closes real $Epoll FD $Epoll = undef; # may call DSKQXS::DESTROY } while (@Timers || keys(%Stack) || $nextq || $wait_pids || $ToClose || keys(%DescriptorMap) || @@ -127,32 +127,24 @@ sub add_uniq_timer { # ($name, $secs, $coderef, @args) = @_; $UniqTimer{$_[0]} //= _add_named_timer(@_); } -# keeping this around in case we support other FD types for now, -# epoll_create1(EPOLL_CLOEXEC) requires Linux 2.6.27+... -sub set_cloexec ($) { - my ($fd) = @_; - - open($_io, '+<&=', $fd) or return; - defined(my $fl = fcntl($_io, F_GETFD, 0)) or return; - fcntl($_io, F_SETFD, $fl | FD_CLOEXEC); -} - # caller sets return value to $Epoll -sub _InitPoller -{ - if (PublicInbox::Syscall::epoll_defined()) { - my $fd = epoll_create(); - set_cloexec($fd) if (defined($fd) && $fd >= 0); - $fd; - } else { - my $cls; - for (qw(DSKQXS DSPoll)) { - $cls = "PublicInbox::$_"; - last if eval "require $cls"; - } - $cls->import(qw(epoll_ctl epoll_wait)); - $cls->new; - } +sub _InitPoller () { + if (PublicInbox::Syscall::epoll_defined()) { + my $fd = epoll_create(); + die "epoll_create: $!" if $fd < 0; + open($ep_io, '+<&=', $fd) or return; + my $fl = fcntl($ep_io, F_GETFD, 0); + fcntl($ep_io, F_SETFD, $fl | FD_CLOEXEC); + $fd; + } else { + my $cls; + for (qw(DSKQXS DSPoll)) { + $cls = "PublicInbox::$_"; + last if eval "require $cls"; + } + $cls->import(qw(epoll_ctl epoll_wait)); + $cls->new; + } } sub now () { clock_gettime(CLOCK_MONOTONIC) }