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 +++++++++++++++++++++- lib/PublicInbox/KQNotify.pm | 6 ++++++ 2 files changed, 27 insertions(+), 1 deletion(-) (limited to 'lib') 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; diff --git a/lib/PublicInbox/KQNotify.pm b/lib/PublicInbox/KQNotify.pm index 3cf9c0f5..1b5c578e 100644 --- a/lib/PublicInbox/KQNotify.pm +++ b/lib/PublicInbox/KQNotify.pm @@ -31,6 +31,7 @@ sub watch { } else { die "TODO Not implemented: $mask"; } + bless \$fh, 'PublicInbox::KQNotify::Watch'; } # emulate Linux::Inotify::fileno @@ -57,4 +58,9 @@ sub poll { } } +package PublicInbox::KQNotify::Watch; +use strict; + +sub cancel { close ${$_[0]} or die "close: $!" } + 1; -- cgit v1.2.3-24-ge0c7