From 1bc3707e3e0983c9aed898980ec8acf6501813f7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 2 Jul 2020 03:32:56 +0000 Subject: inboxidle: avoid per-inbox anonymous subs Anonymous subs cost over 5K each on x86-64. So prefer the less-recommended-but-still-documented way of using Linux::Inotify2::watch to register watchers. This also updates FakeInotify to detect modifications correctly when used on systems with neither IO::KQueue nor Linux::Inotify2. --- lib/PublicInbox/DirIdle.pm | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'lib/PublicInbox/DirIdle.pm') diff --git a/lib/PublicInbox/DirIdle.pm b/lib/PublicInbox/DirIdle.pm index fbbc9531..89cce305 100644 --- a/lib/PublicInbox/DirIdle.pm +++ b/lib/PublicInbox/DirIdle.pm @@ -23,7 +23,7 @@ if ($^O eq 'linux' && eval { require Linux::Inotify2; 1 }) { sub new { my ($class, $dirs, $cb) = @_; - my $self = bless {}, $class; + my $self = bless { cb => $cb }, $class; my $inot; if ($ino_cls) { $inot = $ino_cls->new or die "E: $ino_cls->new: $!"; @@ -35,15 +35,20 @@ sub new { } # Linux::Inotify2->watch or similar - $inot->watch($_, $MAIL_IN, $cb) for @$dirs; + $inot->watch($_, $MAIL_IN) for @$dirs; $self->{inot} = $inot; + PublicInbox::FakeInotify::poll_once($self) if !$ino_cls; $self; } sub event_step { my ($self) = @_; - eval { $self->{inot}->poll }; # Linux::Inotify2::poll - warn "$self->{inot}->poll err: $@\n" if $@; + my $cb = $self->{cb}; + eval { + my @events = $self->{inot}->read; # Linux::Inotify2->read + $cb->($_) for @events; + }; + warn "$self->{inot}->read err: $@\n" if $@; } 1; -- cgit v1.2.3-24-ge0c7