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,AWL,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 9D8AC1F9FC for ; Sat, 16 Oct 2021 01:01:03 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 02/12] dir_idle: do not add watches in ->new Date: Sat, 16 Oct 2021 01:00:53 +0000 Message-Id: <20211016010103.30825-3-e@80x24.org> In-Reply-To: <20211016010103.30825-1-e@80x24.org> References: <20211016010103.30825-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: There's no savings in having two ways to add watches to an inotify nor kqueue descriptor. --- lib/PublicInbox/DirIdle.pm | 8 +------- lib/PublicInbox/LEI.pm | 5 +++-- lib/PublicInbox/Watch.pm | 3 ++- t/dir_idle.t | 3 ++- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/PublicInbox/DirIdle.pm b/lib/PublicInbox/DirIdle.pm index c9a293e9355a..270d3829bc3e 100644 --- a/lib/PublicInbox/DirIdle.pm +++ b/lib/PublicInbox/DirIdle.pm @@ -32,7 +32,7 @@ if ($^O eq 'linux' && eval { require Linux::Inotify2; 1 }) { } sub new { - my ($class, $dirs, $cb, $gone) = @_; + my ($class, $cb) = @_; my $self = bless { cb => $cb }, $class; my $inot; if ($ino_cls) { @@ -43,13 +43,7 @@ sub new { require PublicInbox::FakeInotify; $inot = PublicInbox::FakeInotify->new; # starts timer } - - # Linux::Inotify2->watch or similar - my $fl = $MAIL_IN; - $fl |= $MAIL_GONE if $gone; - $inot->watch($_, $fl) for @$dirs; $self->{inot} = $inot; - PublicInbox::FakeInotify::poll_once($self) if !$ino_cls; $self; } diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 7dfd33989186..a526a91f8035 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -1305,10 +1305,11 @@ sub lazy_start { USR2 => \&noop, }; require PublicInbox::DirIdle; - local $dir_idle = PublicInbox::DirIdle->new([$sock_dir], sub { + local $dir_idle = PublicInbox::DirIdle->new(sub { # just rely on wakeup to hit PostLoopCallback set below dir_idle_handler($_[0]) if $_[0]->fullname ne $path; - }, 1); + }); + $dir_idle->add_watches([$sock_dir]); PublicInbox::DS->SetPostLoopCallback(sub { my ($dmap, undef) = @_; if (@st = defined($path) ? stat($path) : ()) { diff --git a/lib/PublicInbox/Watch.pm b/lib/PublicInbox/Watch.pm index c6bebce32edb..b48d9cccc3e2 100644 --- a/lib/PublicInbox/Watch.pm +++ b/lib/PublicInbox/Watch.pm @@ -282,7 +282,8 @@ sub watch_fs_init ($) { }; require PublicInbox::DirIdle; # inotify_create + EPOLL_CTL_ADD - PublicInbox::DirIdle->new([keys %{$self->{mdmap}}], $cb); + my $dir_idle = PublicInbox::DirIdle->new($cb); + $dir_idle->add_watches([keys %{$self->{mdmap}}]); } sub net_cb { # NetReader::(nntp|imap)_each callback diff --git a/t/dir_idle.t b/t/dir_idle.t index 8e7f3b70eec4..19e54967bf80 100644 --- a/t/dir_idle.t +++ b/t/dir_idle.t @@ -9,7 +9,8 @@ my ($tmpdir, $for_destroy) = tmpdir(); make_path("$tmpdir/a/b", "$tmpdir/c"); my @x; my $cb = sub { push @x, \@_ }; -my $di = PublicInbox::DirIdle->new(["$tmpdir/a", "$tmpdir/c"], $cb, 1); +my $di = PublicInbox::DirIdle->new($cb); +$di->add_watches(["$tmpdir/a", "$tmpdir/c"], 1); PublicInbox::DS->SetLoopTimeout(1000); my $end = 3 + now; PublicInbox::DS->SetPostLoopCallback(sub { scalar(@x) == 0 && now < $end });