From 78cf2586c2e9d7f8e7a77c24ccca3d054ab9d0a6 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 26 Mar 2023 10:52:46 +0000 Subject: watch: do not recreate signalfd on SIGHUP The normal method by which PublicInbox::DS::event_loop sets up signals once needs some coercing to work with -watch. Otherwise, we'll end up wasting FDs every time somebody reloads -watch via SIGHUP. --- lib/PublicInbox/Watch.pm | 5 +++-- script/public-inbox-watch | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/Watch.pm b/lib/PublicInbox/Watch.pm index 810fb63b..693c7181 100644 --- a/lib/PublicInbox/Watch.pm +++ b/lib/PublicInbox/Watch.pm @@ -528,7 +528,8 @@ sub watch_nntp_init ($$) { sub watch { # main entry point my ($self, $sig, $oldset) = @_; $self->{oldset} = $oldset; - $self->{sig} = $sig; + my $first_sig; + $self->{sig} //= ($first_sig = $sig); my $poll = {}; # intvl_seconds => [ uri1, uri2 ] watch_imap_init($self, $poll) if $self->{imap}; watch_nntp_init($self, $poll) if $self->{nntp}; @@ -538,7 +539,7 @@ sub watch { # main entry point } watch_fs_init($self) if $self->{mdre}; local @PublicInbox::DS::post_loop_do = (sub { !$self->quit_done }); - PublicInbox::DS::event_loop($sig, $oldset); # calls ->event_step + PublicInbox::DS::event_loop($first_sig, $oldset); # calls ->event_step _done_for_now($self); } diff --git a/script/public-inbox-watch b/script/public-inbox-watch index 4c50461f..2fb27343 100755 --- a/script/public-inbox-watch +++ b/script/public-inbox-watch @@ -27,6 +27,7 @@ my $reload = sub { $watch->quit; $watch = PublicInbox::Watch->new(PublicInbox::Config->new); if ($watch) { + $watch->{sig} = $prev->{sig}; # prevent redundant signalfd warn "# reloaded\n"; } else { warn("E: reloading failed\n"); -- cgit v1.2.3-24-ge0c7