MANIFEST | 1 + lib/PublicInbox/DirIdle.pm | 11 +++++++++++ lib/PublicInbox/LEI.pm | 2 +- lib/PublicInbox/LI2Wrap.pm | 19 +++++++++++++++++++ diff --git a/MANIFEST b/MANIFEST index a39135018f39275606a87b8e40887d17497dd1f0..fb9f16bfb37ebb3d8f20a80570aa77754ceed306 100644 --- a/MANIFEST +++ b/MANIFEST @@ -197,6 +197,7 @@ lib/PublicInbox/InputPipe.pm lib/PublicInbox/Isearch.pm lib/PublicInbox/KQNotify.pm lib/PublicInbox/LEI.pm +lib/PublicInbox/LI2Wrap.pm lib/PublicInbox/LeiALE.pm lib/PublicInbox/LeiAddWatch.pm lib/PublicInbox/LeiAuth.pm diff --git a/lib/PublicInbox/DirIdle.pm b/lib/PublicInbox/DirIdle.pm index 65896f950f51f756998899bd44a8c44a4442c116..d572c2749f7fc750e0a3ae3cbcf8748b1263ef10 100644 --- a/lib/PublicInbox/DirIdle.pm +++ b/lib/PublicInbox/DirIdle.pm @@ -84,4 +84,15 @@ }; warn "$self->{inot}->read err: $@\n" if $@; } +sub force_close { + my ($self) = @_; + my $inot = delete $self->{inot} // return; + if ($inot->can('fh')) { # Linux::Inotify2 2.3+ + close($inot->fh) or warn "CLOSE ERROR: $!"; + } elsif ($inot->isa('Linux::Inotify2')) { + require PublicInbox::LI2Wrap; + PublicInbox::LI2Wrap::wrapclose($inot); + } +} + 1; diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index d9fd40fd90e8244399e89a252f7f55a943cc2ea5..e6f763e1067869e0a7c6d3bb8a90e2b544f45e0d 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -556,7 +556,7 @@ close($_) for (@$pgr[1,2]); } close $listener if $listener; undef $listener; - undef $dir_idle; + $dir_idle->force_close if $dir_idle; %PATH2CFG = (); $MDIR2CFGPATH = {}; eval 'no warnings; undef $PublicInbox::LeiNoteEvent::to_flush'; diff --git a/lib/PublicInbox/LI2Wrap.pm b/lib/PublicInbox/LI2Wrap.pm new file mode 100644 index 0000000000000000000000000000000000000000..61cf4beef081e6d7d4128484e88e0d5a9df6a1c2 --- /dev/null +++ b/lib/PublicInbox/LI2Wrap.pm @@ -0,0 +1,19 @@ +# Copyright (C) all contributors +# License: AGPL-3.0+ + +# Wrapper for Linux::Inotify2 < 2.3 which lacked ->fh and auto-close +# Remove this when supported LTS/enterprise distros are all +# Linux::Inotify2 >= 2.3 +package PublicInbox::LI2Wrap; +use v5.10.1; +our @ISA = qw(Linux::Inotify2); + +sub wrapclose { + my ($inot) = @_; + my $fd = $inot->fileno; + open my $fh, '<&=', $fd or die "open <&= $fd $!"; +} + +sub DESTROY {} # no-op + +1