]> Sergey Matveev's repositories - public-inbox.git/commitdiff
treewide: fix %SIG localization, harder
authorEric Wong <e@80x24.org>
Wed, 22 Sep 2021 02:24:30 +0000 (02:24 +0000)
committerEric Wong <e@80x24.org>
Wed, 22 Sep 2021 05:21:19 +0000 (05:21 +0000)
This fixes the occasional t/lei-sigpipe.t infinite loop
under "make check-run".

Link: http://nntp.perl.org/group/perl.perl5.porters/258784
  <CAHhgV8hPbcmkzWizp6Vijw921M5BOXixj4+zTh3nRS9vRBYk8w@mail.gmail.com>
Followup-to: b552bb9150775fe4 ("daemon+watch: fix localization of %SIG for non-signalfd users")
lib/PublicInbox/Admin.pm
lib/PublicInbox/ExtSearchIdx.pm
lib/PublicInbox/IPC.pm
lib/PublicInbox/TestCommon.pm
lib/PublicInbox/Watch.pm
lib/PublicInbox/Xapcmd.pm
t/run.perl

index 9ff59bca3eea304198090585e93eb6f2946853a0..20964f9cf7ac97dc7428c0a3cbee58d5e0050bb9 100644 (file)
@@ -274,7 +274,7 @@ sub index_inbox {
        if (my $pr = $opt->{-progress}) {
                $pr->("indexing $ibx->{inboxdir} ...\n");
        }
-       local %SIG = %SIG;
+       local @SIG{keys %SIG} = values %SIG;
        setup_signals(\&index_terminate, $ibx);
        my $idx = { current_info => $ibx->{inboxdir} };
        local $SIG{__WARN__} = sub {
index e0ba6c32d6794391e62d8693bde85d2baeee27ec..6b29789a2ed89d33d12e654d6a95f9bbe65cc8fa 100644 (file)
@@ -1272,7 +1272,7 @@ sub event_step { # PublicInbox::DS::requeue callback
 
 sub eidx_watch { # public-inbox-extindex --watch main loop
        my ($self, $opt) = @_;
-       local %SIG = %SIG;
+       local @SIG{keys %SIG} = values %SIG;
        for my $sig (qw(HUP USR1 TSTP QUIT INT TERM)) {
                $SIG{$sig} = sub { warn "SIG$sig ignored while scanning\n" };
        }
@@ -1307,7 +1307,7 @@ sub eidx_watch { # public-inbox-extindex --watch main loop
        $sig->{QUIT} = $sig->{INT} = $sig->{TERM} = $quit;
        my $sigfd = PublicInbox::Sigfd->new($sig,
                                        $PublicInbox::Syscall::SFD_NONBLOCK);
-       %SIG = (%SIG, %$sig) if !$sigfd;
+       @SIG{keys %$sig} = values(%$sig) if !$sigfd;
        local $self->{-watch_sync} = $sync; # for ->on_inbox_unlock
        if (!$sigfd) {
                # wake up every second to accept signals if we don't
index 1c699d76fea1578558ec5361ae5d8e19913deef7..3e29def87bf57de2f47b7593fa7600f1aad2275c 100644 (file)
@@ -115,7 +115,7 @@ sub ipc_worker_spawn {
                        $fields //= {};
                        local @$self{keys %$fields} = values(%$fields);
                        my $on_destroy = $self->ipc_atfork_child;
-                       local %SIG = %SIG;
+                       local @SIG{keys %SIG} = values %SIG;
                        PublicInbox::DS::sig_setmask($sigset);
                        ipc_worker_loop($self, $r_req, $w_res);
                };
@@ -361,7 +361,7 @@ sub _wq_worker_start ($$$$) {
                        $fields //= {};
                        local @$self{keys %$fields} = values(%$fields);
                        my $on_destroy = $self->ipc_atfork_child;
-                       local %SIG = %SIG;
+                       local @SIG{keys %SIG} = values %SIG;
                        PublicInbox::DS::sig_setmask($oldset);
                        wq_worker_loop($self, $bcast2);
                };
index 9e15239465aabe05728603b3db8869f48f128b7c..92a7db36969559f28e358d616c032e84daa24faa 100644 (file)
@@ -317,7 +317,8 @@ sub run_script ($;$$) {
                # note: "local *STDIN = *STDIN;" and so forth did not work in
                # old versions of perl
                local %ENV = $env ? (%ENV, %$env) : %ENV;
-               local %SIG = %SIG;
+               local @SIG{keys %SIG} = map { undef } values %SIG;
+               local $SIG{FPE} = 'IGNORE'; # Perl default
                local $0 = join(' ', @$cmd);
                my $orig_io = _prepare_redirects($fhref);
                my $cwdfh = $lei_cwdfh;
index 387eb6d252e9a0f329b1fcbaef0ec81a8020a70e..0523ad03f8710257e60957d6ddddb23b7943689f 100644 (file)
@@ -384,7 +384,9 @@ sub watch_atfork_child ($) {
        delete $self->{poll_pids};
        delete $self->{opendirs};
        PublicInbox::DS->Reset;
-       %SIG = (%SIG, %{$self->{sig}}, CHLD => 'DEFAULT');
+       my $sig = delete $self->{sig};
+       $sig->{CHLD} = 'DEFAULT';
+       @SIG{keys %$sig} = values %$sig;
        PublicInbox::DS::sig_setmask($self->{oldset});
 }
 
index 588e7b9408617e1fb92adef2a7b91dde3014820d..b962fa848c8ada9e0b3b029876cce808deb194a5 100644 (file)
@@ -149,7 +149,7 @@ sub process_queue {
 
        # run in parallel:
        my %pids;
-       local %SIG = %SIG;
+       local @SIG{keys %SIG} = values %SIG;
        setup_signals(\&kill_pids, \%pids);
        while (@$queue) {
                while (scalar(keys(%pids)) < $max && scalar(@$queue)) {
@@ -285,7 +285,7 @@ sub run {
                PublicInbox::SearchIdx::load_xapian_writable();
        }
 
-       local %SIG = %SIG;
+       local @SIG{keys %SIG} = values %SIG;
        setup_signals();
        $ibx->with_umask(\&_run, $ibx, $cb, $opt);
 }
@@ -343,7 +343,7 @@ sub compact ($$) { # cb_spawn callback
        $pr->("$pfx `".join(' ', @$cmd)."'\n") if $pr;
        push @$cmd, $src, $dst;
        my ($rd, $pid);
-       local %SIG = %SIG;
+       local @SIG{keys %SIG} = values %SIG;
        setup_signals(\&kill_compact, \$pid);
        ($rd, $pid) = popen_rd($cmd, undef, $rdr);
        while (<$rd>) {
@@ -428,7 +428,7 @@ sub cpdb ($$) { # cb_spawn callback
        }
 
        my ($tmp, $ft);
-       local %SIG = %SIG;
+       local @SIG{keys %SIG} = values %SIG;
        if ($opt->{compact}) {
                my ($dir) = ($new =~ m!(.*?/)[^/]+/*\z!);
                same_fs_or_die($dir, $new);
index e5ee0ade3de72ca57467e27f72f128b27484de0e..0fe6d08bb9c4c78a87de11a055a5bf61262baf61 100755 (executable)
@@ -168,6 +168,7 @@ my $start_worker = sub {
        my $pid = fork // DIE "fork: $!";
        if ($pid == 0) {
                close $wr if $wr;
+               $SIG{USR1} = undef; # undo parent $SIG{USR1}
                $worker = $$;
                while (1) {
                        my $r = sysread($rd, my $buf, UINT_SIZE);