From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH] xap_helper.pm: quiet undefined warnings at shutdown
Date: Mon, 23 Oct 2023 19:35:17 +0000 [thread overview]
Message-ID: <20231023193518.76630-1-e@80x24.org> (raw)
We can't force EBADF with high-level I/O wrappers like we can
in C, so instead we quiet Perl itself.
---
lib/PublicInbox/XapHelper.pm | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/lib/PublicInbox/XapHelper.pm b/lib/PublicInbox/XapHelper.pm
index eea10a44..55080abf 100644
--- a/lib/PublicInbox/XapHelper.pm
+++ b/lib/PublicInbox/XapHelper.pm
@@ -17,7 +17,7 @@ use autodie qw(open getsockopt);
use POSIX qw(:signal_h);
use Fcntl qw(LOCK_UN LOCK_EX);
my $X = \%PublicInbox::Search::X;
-our (%SRCH, %WORKERS, $alive, $nworker, $workerset, $in);
+our (%SRCH, %WORKERS, $nworker, $workerset, $in);
our $stderr = \*STDERR;
# only short options for portability in C++ implementation
@@ -179,7 +179,11 @@ sub recv_loop {
local $SIG{TERM} = sub { undef $in };
while (defined($in)) {
PublicInbox::DS::sig_setmask($workerset);
- my @fds = $PublicInbox::IPC::recv_cmd->($in, $rbuf, 4096*33);
+ my @fds = do { # we undef $in in SIG{TERM}
+ no strict 'refs';
+ no warnings 'uninitialized';
+ $PublicInbox::IPC::recv_cmd->($in, $rbuf, 4096*33)
+ };
scalar(@fds) or exit(66); # EX_NOINPUT
die "recvmsg: $!" if !defined($fds[0]);
PublicInbox::DS::block_signals();
@@ -201,11 +205,11 @@ sub reap_worker { # awaitpid CB
my ($pid, $nr) = @_;
delete $WORKERS{$nr};
if (($? >> 8) == 66) { # EX_NOINPUT
- $alive = undef;
+ undef $in;
} elsif ($?) {
warn "worker[$nr] died \$?=$?\n";
}
- PublicInbox::DS::requeue(\&start_workers) if $alive;
+ PublicInbox::DS::requeue(\&start_workers) if $in;
}
sub start_worker ($) {
@@ -230,27 +234,26 @@ sub start_worker ($) {
sub start_workers {
for my $nr (grep { !defined($WORKERS{$_}) } (0..($nworker - 1))) {
- start_worker($nr) if $alive;
+ start_worker($nr) if $in;
}
}
sub do_sigttou {
- if ($alive && $nworker > 1) {
+ if ($in && $nworker > 1) {
--$nworker;
my @nr = grep { $_ >= $nworker } keys %WORKERS;
kill('TERM', @WORKERS{@nr});
}
}
-sub xh_alive { $alive || scalar(keys %WORKERS) }
+sub xh_alive { $in || scalar(keys %WORKERS) }
sub start (@) {
my (@argv) = @_;
- my $c = getsockopt($in = \*STDIN, SOL_SOCKET, SO_TYPE);
+ my $c = getsockopt(local $in = \*STDIN, SOL_SOCKET, SO_TYPE);
unpack('i', $c) == SOCK_SEQPACKET or die 'stdin is not SOCK_SEQPACKET';
local (%SRCH, %WORKERS);
- local $alive = 1;
PublicInbox::Search::load_xapian();
$GLP->getoptionsfromarray(\@argv, my $opt = { j => 1 }, 'j=i') or
die 'bad args';
@@ -268,7 +271,7 @@ sub start (@) {
}
my $sig = {
TTIN => sub {
- if ($alive) {
+ if ($in) {
++$nworker;
PublicInbox::DS::requeue(\&start_workers)
}
reply other threads:[~2023-10-23 19:36 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://public-inbox.org/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231023193518.76630-1-e@80x24.org \
--to=e@80x24.org \
--cc=meta@public-inbox.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).