user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH] xap_helper.pm: quiet undefined die at shutdown
@ 2023-10-31 20:34  6% Eric Wong
  0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2023-10-31 20:34 UTC (permalink / raw)
  To: meta

Another attempt at doing what commit 35de8fdcbf290e25
(xap_helper.pm: quiet undefined warnings at shutdown, 2023-10-23)
tried to do.  It turns out perl croaks (not warn/carp) when it sees
an undefined file handle, here.
---
 lib/PublicInbox/XapHelper.pm | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/lib/PublicInbox/XapHelper.pm b/lib/PublicInbox/XapHelper.pm
index 55080abf..f7640f4c 100644
--- a/lib/PublicInbox/XapHelper.pm
+++ b/lib/PublicInbox/XapHelper.pm
@@ -179,11 +179,13 @@ sub recv_loop {
 	local $SIG{TERM} = sub { undef $in };
 	while (defined($in)) {
 		PublicInbox::DS::sig_setmask($workerset);
-		my @fds = do { # we undef $in in SIG{TERM}
-			no strict 'refs';
-			no warnings 'uninitialized';
+		my @fds = eval { # we undef $in in SIG{TERM}
 			$PublicInbox::IPC::recv_cmd->($in, $rbuf, 4096*33)
 		};
+		if ($@) {
+			exit if !$in; # hit by SIGTERM
+			die;
+		}
 		scalar(@fds) or exit(66); # EX_NOINPUT
 		die "recvmsg: $!" if !defined($fds[0]);
 		PublicInbox::DS::block_signals();

^ permalink raw reply related	[relevance 6%]

* [PATCH] xap_helper.pm: quiet undefined warnings at shutdown
@ 2023-10-23 19:35  7% Eric Wong
  0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2023-10-23 19:35 UTC (permalink / raw)
  To: meta

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)
 			}

^ permalink raw reply related	[relevance 7%]

Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2023-10-23 19:35  7% [PATCH] xap_helper.pm: quiet undefined warnings at shutdown Eric Wong
2023-10-31 20:34  6% [PATCH] xap_helper.pm: quiet undefined die " Eric Wong

Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

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).