X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FDirIdle.pm;fp=lib%2FPublicInbox%2FDirIdle.pm;h=ffceda66530b73d9a75abf162b60faaea565f0a5;hb=b2b1006759730507731fcd3fc3e0de68239e3b92;hp=0000000000000000000000000000000000000000;hpb=5808636263d72b635a46100a7e7037074dad8f75;p=public-inbox.git diff --git a/lib/PublicInbox/DirIdle.pm b/lib/PublicInbox/DirIdle.pm new file mode 100644 index 00000000..ffceda66 --- /dev/null +++ b/lib/PublicInbox/DirIdle.pm @@ -0,0 +1,50 @@ +# Copyright (C) 2020 all contributors +# License: AGPL-3.0+ + +# Used by public-inbox-watch for Maildir (and possibly MH in the future) +package PublicInbox::DirIdle; +use strict; +use base 'PublicInbox::DS'; +use fields qw(inot); +use PublicInbox::Syscall qw(EPOLLIN EPOLLET); +use PublicInbox::In2Tie; + +my ($MAIL_IN, $ino_cls); +if ($^O eq 'linux' && eval { require Linux::Inotify2; 1 }) { + $MAIL_IN = Linux::Inotify2::IN_MOVED_TO() | + Linux::Inotify2::IN_CREATE(); + $ino_cls = 'Linux::Inotify2'; +} elsif (eval { require PublicInbox::KQNotify }) { + $MAIL_IN = PublicInbox::KQNotify::MOVED_TO_OR_CREATE(); + $ino_cls = 'PublicInbox::KQNotify'; +} else { + require PublicInbox::FakeInotify; + $MAIL_IN = PublicInbox::FakeInotify::MOVED_TO_OR_CREATE(); +} + +sub new { + my ($class, $dirs, $cb) = @_; + my $self = fields::new($class); + my $inot; + if ($ino_cls) { + $inot = $ino_cls->new or die "E: $ino_cls->new: $!"; + my $io = PublicInbox::In2Tie::io($inot); + $self->SUPER::new($io, EPOLLIN | EPOLLET); + } else { + require PublicInbox::FakeInotify; + $inot = PublicInbox::FakeInotify->new; # starts timer + } + + # Linux::Inotify2->watch or similar + $inot->watch($_, $MAIL_IN, $cb) for @$dirs; + $self->{inot} = $inot; + $self; +} + +sub event_step { + my ($self) = @_; + eval { $self->{inot}->poll }; # Linux::Inotify2::poll + warn "$self->{inot}->poll err: $@\n" if $@; +} + +1;