From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3FAF71F406 for ; Mon, 23 Oct 2023 19:36:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1698089805; bh=lvtBf9UQ3tpl7xHEgp4Zz4TnyG6UXZHfKsJNalyd2wo=; h=From:To:Subject:Date:From; b=hTzf7NRt/4MnWc7HG/Onp00K28nYgB/uuLHhSoME9ZsCb3NKs2y1oWknVvFCsFj4Q G5wAx0PwARAcUUqhL9Gg7mhJ72kO2JgUOAM+e9j62+/8wWlSvubIBNqplO5A2Qb7Ui V5fzpAIQBA+5D3qNfwO4Q5Ne1XvSrDeEWYwksZIU= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] xap_helper.pm: quiet undefined warnings at shutdown Date: Mon, 23 Oct 2023 19:35:17 +0000 Message-ID: <20231023193518.76630-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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) }