about summary refs log tree commit homepage
path: root/lib/PublicInbox/FakeInotify.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-06-10 07:04:08 +0000
committerEric Wong <e@yhbt.net>2020-06-13 07:55:45 +0000
commitb5217ee1eee64ff22e085c9eb942b5ea65da9bd9 (patch)
tree0ebfbc0ed3f1b1642ff0cbcd4a52cd78f04a2a1d /lib/PublicInbox/FakeInotify.pm
parent0735aef9bffc4779628a069aefc438e5371b40cc (diff)
downloadpublic-inbox-b5217ee1eee64ff22e085c9eb942b5ea65da9bd9.tar.gz
We can fill in some missing pieces from the emulation APIs
to enable IMAP IDLE tests on non-Linux platforms.
Diffstat (limited to 'lib/PublicInbox/FakeInotify.pm')
-rw-r--r--lib/PublicInbox/FakeInotify.pm22
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/PublicInbox/FakeInotify.pm b/lib/PublicInbox/FakeInotify.pm
index bd610463..b077d63a 100644
--- a/lib/PublicInbox/FakeInotify.pm
+++ b/lib/PublicInbox/FakeInotify.pm
@@ -8,13 +8,30 @@ use strict;
 use Time::HiRes qw(stat);
 my $IN_CLOSE = 0x08 | 0x10; # match Linux inotify
 
-sub new { bless { watch => {} }, __PACKAGE__ }
+my $poll_intvl = 2; # same as Filesys::Notify::Simple
+my $for_cancel = bless \(my $x), 'PublicInbox::FakeInotify::Watch';
+
+sub poll_once {
+        my ($self) = @_;
+        sub {
+                eval { $self->poll };
+                warn "E: FakeInotify->poll: $@\n" if $@;
+                PublicInbox::DS::add_timer($poll_intvl, poll_once($self));
+        };
+}
+
+sub new {
+        my $self = bless { watch => {} }, __PACKAGE__;
+        PublicInbox::DS::add_timer($poll_intvl, poll_once($self));
+        $self;
+}
 
 # behaves like Linux::Inotify2->watch
 sub watch {
         my ($self, $path, $mask, $cb) = @_;
         my @st = stat($path) or return;
         $self->{watch}->{"$path\0$mask"} = [ @st, $cb ];
+        $for_cancel;
 }
 
 # behaves like non-blocking Linux::Inotify2->poll
@@ -36,4 +53,7 @@ sub poll {
         }
 }
 
+package PublicInbox::FakeInotify::Watch;
+sub cancel {} # noop
+
 1;