diff options
author | Eric Wong <e@80x24.org> | 2023-09-08 07:51:29 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2023-09-08 10:38:40 +0000 |
commit | 232c35005bd8ff44104267e47bc908550bb9e471 (patch) | |
tree | 31159f8fa4ba9c753274fb9cebf05ee7d8552ee6 /lib/PublicInbox/TailNotify.pm | |
parent | aa03dc3427e1b9a0c19b2fe0639ad5e53c37ac7a (diff) | |
download | public-inbox-232c35005bd8ff44104267e47bc908550bb9e471.tar.gz |
This allows t/tail_notify.t to pass more reliably using FreeBSD with IO::KQueue.
Diffstat (limited to 'lib/PublicInbox/TailNotify.pm')
-rw-r--r-- | lib/PublicInbox/TailNotify.pm | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/PublicInbox/TailNotify.pm b/lib/PublicInbox/TailNotify.pm index f4ffb296..bdb92d54 100644 --- a/lib/PublicInbox/TailNotify.pm +++ b/lib/PublicInbox/TailNotify.pm @@ -14,12 +14,14 @@ if ($^O eq 'linux' && eval { require PublicInbox::Inotify; 1 }) { Linux::Inotify2::IN_MODIFY(); $ino_cls = 'PublicInbox::Inotify'; } elsif (eval { require PublicInbox::KQNotify }) { - $TAIL_MOD = PublicInbox::KQNotify::MOVED_TO_OR_CREATE(); + $TAIL_MOD = PublicInbox::KQNotify::MOVED_TO_OR_CREATE() | + IO::KQueue::NOTE_DELETE() | IO::KQueue::NOTE_RENAME(); $ino_cls = 'PublicInbox::KQNotify'; } else { require PublicInbox::FakeInotify; $TAIL_MOD = PublicInbox::FakeInotify::MOVED_TO_OR_CREATE() | - PublicInbox::FakeInotify::IN_MODIFY(); + PublicInbox::FakeInotify::IN_MODIFY() | + PublicInbox::FakeInotify::IN_DELETE(); } require IO::Poll if $ino_cls; @@ -49,6 +51,11 @@ sub new { $self; } +sub delete_self { + for (@_) { return 1 if $_->IN_DELETE_SELF } + undef; +} + sub getlines { my ($self, $timeo) = @_; my ($fh, $buf, $rfds, @ret, @events); @@ -70,13 +77,12 @@ again: } select($rfds, undef, undef, $wait); } - # XXX do we care about @events contents? - # use Data::Dumper; warn '# ',Dumper(\@events); if ($fh = $self->{watch_fh}) { sysread($fh, $buf, -s $fh) and push @ret, split(/^/sm, $buf); my @st = stat($self->{fn}); - if (!@st || "@st[0, 1]" ne $self->{ino_dev}) { + if (!@st || "@st[0, 1]" ne $self->{ino_dev} || + delete_self(@events)) { delete @$self{qw(ino_dev watch_fh)}; } } |