From b5217ee1eee64ff22e085c9eb942b5ea65da9bd9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 10 Jun 2020 07:04:08 +0000 Subject: t/imapd: support FakeInotify and KQNotify We can fill in some missing pieces from the emulation APIs to enable IMAP IDLE tests on non-Linux platforms. --- lib/PublicInbox/FakeInotify.pm | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox/FakeInotify.pm') 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; -- cgit v1.2.3-24-ge0c7