]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Daemon.pm
www: use WwwStream for dumping thread and search views
[public-inbox.git] / lib / PublicInbox / Daemon.pm
index 8de7ff24612881cd43babdc23f5c9120b2f2a702..512bb2083c5c65f84f9627c455780c19b7abc62b 100644 (file)
@@ -141,15 +141,15 @@ sub daemonize () {
        };
 
        if ($daemonize) {
-               my ($pid, $err) = do_fork();
-               die "could not fork: $err\n" unless defined $pid;
+               my $pid = fork;
+               die "could not fork: $!\n" unless defined $pid;
                exit if $pid;
 
                open STDOUT, '>&STDIN' or die "redirect stdout failed: $!\n";
                open STDERR, '>&STDIN' or die "redirect stderr failed: $!\n";
                POSIX::setsid();
-               ($pid, $err) = do_fork();
-               die "could not fork: $err\n" unless defined $pid;
+               $pid = fork;
+               die "could not fork: $!\n" unless defined $pid;
                exit if $pid;
        }
        if (defined $pid_file) {
@@ -180,7 +180,8 @@ sub worker_quit {
                my $n = 0;
 
                foreach my $s (values %$dmap) {
-                       if ($s->can('busy') && $s->busy) {
+                       $s->can('busy') or next;
+                       if ($s->busy) {
                                ++$n;
                        } else {
                                # close as much as possible, early as possible
@@ -278,9 +279,9 @@ sub upgrade () {
                $pid_file .= '.oldbin';
                write_pid($pid_file);
        }
-       my ($pid, $err) = do_fork();
+       my $pid = fork;
        unless (defined $pid) {
-               warn "fork failed: $err\n";
+               warn "fork failed: $!\n";
                return;
        }
        if ($pid == 0) {
@@ -305,17 +306,6 @@ sub kill_workers ($) {
        }
 }
 
-sub do_fork () {
-       my $new = POSIX::SigSet->new;
-       $new->fillset;
-       my $old = POSIX::SigSet->new;
-       POSIX::sigprocmask(&POSIX::SIG_BLOCK, $new, $old) or die "SIG_BLOCK: $!";
-       my $pid = fork;
-       my $err = $!;
-       POSIX::sigprocmask(&POSIX::SIG_SETMASK, $old) or die "SIG_SETMASK: $!";
-       ($pid, $err);
-}
-
 sub upgrade_aborted ($) {
        my ($p) = @_;
        warn "reexec PID($p) died with: $?\n";
@@ -350,6 +340,7 @@ sub unlink_pid_file_safe_ish ($$) {
        return unless defined $unlink_pid && $unlink_pid == $$;
 
        open my $fh, '<', $file or return;
+       local $/ = "\n";
        defined(my $read_pid = <$fh>) or return;
        chomp $read_pid;
        if ($read_pid == $unlink_pid) {
@@ -385,7 +376,13 @@ sub master_loop {
                                exit if $quit++;
                                kill_workers($s);
                        } elsif ($s eq 'WINCH') {
-                               $worker_processes = 0;
+                               if ($daemonize) {
+                                       $worker_processes = 0;
+                               } else {
+                                       warn
+"ignoring SIGWINCH since we are not daemonized\n";
+                                       $SIG{WINCH} = 'IGNORE';
+                               }
                        } elsif ($s eq 'HUP') {
                                $worker_processes = $set_workers;
                                kill_workers($s);
@@ -417,9 +414,9 @@ sub master_loop {
                        $n = $worker_processes;
                }
                foreach my $i ($n..($worker_processes - 1)) {
-                       my ($pid, $err) = do_fork();
+                       my $pid = fork;
                        if (!defined $pid) {
-                               warn "failed to fork worker[$i]: $err\n";
+                               warn "failed to fork worker[$i]: $!\n";
                        } elsif ($pid == 0) {
                                $set_user->() if $set_user;
                                return $p0; # run normal work code
@@ -452,6 +449,7 @@ sub daemon_loop ($$) {
        $SIG{QUIT} = $SIG{INT} = $SIG{TERM} = *worker_quit;
        $SIG{USR1} = *reopen_logs;
        $SIG{HUP} = $refresh;
+       $SIG{$_} = 'DEFAULT' for qw(CHLD USR2 TTIN TTOU WINCH);
        # this calls epoll_create:
        @listeners = map {
                PublicInbox::Listener->new($_, $post_accept)