diff options
author | Eric Wong <e@yhbt.net> | 2020-07-02 03:32:56 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-07-02 19:51:14 +0000 |
commit | 1bc3707e3e0983c9aed898980ec8acf6501813f7 (patch) | |
tree | ee00a849c6746dfee4e58691926e4e3a2f954f4a /lib/PublicInbox/DirIdle.pm | |
parent | 62575c514f07260cff5865b7bf122e41178b0476 (diff) | |
download | public-inbox-1bc3707e3e0983c9aed898980ec8acf6501813f7.tar.gz |
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.
Diffstat (limited to 'lib/PublicInbox/DirIdle.pm')
-rw-r--r-- | lib/PublicInbox/DirIdle.pm | 13 |
1 files changed, 9 insertions, 4 deletions
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; |