X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=script%2Fpublic-inbox-watch;h=0249186000b6ee47ea45cd5d03e50a49e04bf333;hb=cee907599bb7eda0695ae91cf8d633670a88d6c7;hp=645abeda971688b3849e77de4bd5cdd46960b0b2;hpb=95bdac7f09c69036efed537a4d03d5bdd2ae4eb6;p=public-inbox.git diff --git a/script/public-inbox-watch b/script/public-inbox-watch index 645abeda..02491860 100755 --- a/script/public-inbox-watch +++ b/script/public-inbox-watch @@ -2,25 +2,44 @@ # Copyright (C) 2016-2020 all contributors # License: AGPL-3.0+ use strict; -use warnings; -use PublicInbox::WatchMaildir; +use IO::Handle; +use PublicInbox::Watch; use PublicInbox::Config; -my ($config, $watch_md); +use PublicInbox::DS; +use PublicInbox::Sigfd; +use PublicInbox::Syscall qw($SFD_NONBLOCK); +my $oldset = PublicInbox::Sigfd::block_signals(); +STDOUT->autoflush(1); +STDERR->autoflush(1); +my ($config, $watch); my $reload = sub { $config = PublicInbox::Config->new; - $watch_md->quit if $watch_md; - $watch_md = PublicInbox::WatchMaildir->new($config); + $watch->quit if $watch; + $watch = PublicInbox::Watch->new($config); }; $reload->(); -if ($watch_md) { - my $scan = sub { $watch_md->trigger_scan('full') if $watch_md }; - $SIG{HUP} = $reload; - $SIG{USR1} = $scan; - $SIG{ALRM} = sub { $SIG{ALRM} = 'DEFAULT'; $scan->() }; - $SIG{QUIT} = $SIG{TERM} = $SIG{INT} = sub { - $watch_md->quit if $watch_md; - $watch_md = undef; +if ($watch) { + my $scan = sub { $watch->trigger_scan('full') if $watch }; + my $quit = sub { + $watch->quit if $watch; + $watch = undef; }; - alarm(1); - $watch_md->watch while ($watch_md); + my $sig = { + HUP => $reload, + USR1 => $scan, + CHLD => \&PublicInbox::DS::enqueue_reap, + }; + $sig->{QUIT} = $sig->{TERM} = $sig->{INT} = $quit; + + # --no-scan is only intended for testing atm, undocumented. + unless (grep(/\A--no-scan\z/, @ARGV)) { + PublicInbox::DS::requeue($scan); + } + my $sigfd = PublicInbox::Sigfd->new($sig, $SFD_NONBLOCK); + local %SIG = (%SIG, %$sig) if !$sigfd; + if (!$sigfd) { + PublicInbox::Sigfd::set_sigmask($oldset); + PublicInbox::DS->SetLoopTimeout(1000); + } + $watch->watch($sig, $oldset) while ($watch); }