about summary refs log tree commit homepage
path: root/lib/PublicInbox/TailNotify.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-09-08 07:51:29 +0000
committerEric Wong <e@80x24.org>2023-09-08 10:38:40 +0000
commit232c35005bd8ff44104267e47bc908550bb9e471 (patch)
tree31159f8fa4ba9c753274fb9cebf05ee7d8552ee6 /lib/PublicInbox/TailNotify.pm
parentaa03dc3427e1b9a0c19b2fe0639ad5e53c37ac7a (diff)
downloadpublic-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.pm16
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)};
                 }
         }