X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FDaemon.pm;h=000ba1695d666bb7eed68677b5418e7bb8bbe23a;hb=0877ff2595baf86c10b27b6dd2364f5235457430;hp=2f63bd73b4a2ff0dcd6ae4e8618775f76f4315b5;hpb=90f11ce471c53365a77896c847d0a39b0995b5b5;p=public-inbox.git diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm index 2f63bd73..000ba169 100644 --- a/lib/PublicInbox/Daemon.pm +++ b/lib/PublicInbox/Daemon.pm @@ -15,12 +15,12 @@ use Cwd qw/abs_path/; STDOUT->autoflush(1); STDERR->autoflush(1); use PublicInbox::DS qw(now); -use PublicInbox::Syscall qw(SFD_NONBLOCK); +use PublicInbox::Syscall qw($SFD_NONBLOCK); require PublicInbox::Listener; -require PublicInbox::ParentPipe; -require PublicInbox::Sigfd; +use PublicInbox::EOFpipe; +use PublicInbox::Sigfd; my @CMD; -my ($set_user, $oldset, $newset); +my ($set_user, $oldset); my (@cfg_listen, $stdout, $stderr, $group, $user, $pid_file, $daemonize); my $worker_processes = 1; my @listeners; @@ -72,15 +72,10 @@ sub accept_tls_opt ($) { { SSL_server => 1, SSL_startHandshake => 0, SSL_reuse_ctx => $ctx }; } -sub sig_setmask { sigprocmask(SIG_SETMASK, @_) or die "sigprocmask: $!" } - sub daemon_prepare ($) { my ($default_listen) = @_; my $listener_names = {}; # sockname => IO::Handle - $oldset = POSIX::SigSet->new(); - $newset = POSIX::SigSet->new(); - $newset->fillset or die "fillset: $!"; - sig_setmask($newset, $oldset); + my $oldset = PublicInbox::Sigfd::block_signals(); @CMD = ($0, @ARGV); my %opts = ( 'l|listen=s' => \@cfg_listen, @@ -473,8 +468,6 @@ sub master_quit ($) { sub master_loop { pipe(my ($p0, $p1)) or die "failed to create parent-pipe: $!"; - # 1031: F_SETPIPE_SZ, 4096: page size - fcntl($p1, 1031, 4096) if $^O eq 'linux'; my $set_workers = $worker_processes; reopen_logs(); my $ignore_winch; @@ -515,7 +508,7 @@ EOF }; my $sigfd = PublicInbox::Sigfd->new($sig, 0); local %SIG = (%SIG, %$sig) if !$sigfd; - sig_setmask($oldset) if !$sigfd; + PublicInbox::restore_signals($oldset) if !$sigfd; while (1) { # main loop my $n = scalar keys %pids; unless (@listeners) { @@ -531,7 +524,7 @@ EOF } my $want = $worker_processes - 1; if ($n <= $want) { - sig_setmask($newset) if !$sigfd; + PublicInbox::Sigfd::block_signals() if !$sigfd; for my $i ($n..$want) { my $pid = fork; if (!defined $pid) { @@ -544,7 +537,7 @@ EOF $pids{$pid} = $i; } } - sig_setmask($oldset) if !$sigfd; + PubliInbox::Sigfd::set_sigmask($oldset) if !$sigfd; } if ($sigfd) { # Linux and IO::KQueue users: @@ -608,7 +601,7 @@ sub daemon_loop ($$$$) { if ($worker_processes > 0) { $refresh->(); # preload by default my $fh = master_loop(); # returns if in child process - PublicInbox::ParentPipe->new($fh, \&worker_quit); + PublicInbox::EOFpipe->new($fh, \&worker_quit, undef); } else { reopen_logs(); $set_user->() if $set_user; @@ -627,12 +620,12 @@ sub daemon_loop ($$$$) { # this calls epoll_create: PublicInbox::Listener->new($_, $tls_cb || $post_accept) } @listeners; - my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); + my $sigfd = PublicInbox::Sigfd->new($sig, $SFD_NONBLOCK); local %SIG = (%SIG, %$sig) if !$sigfd; if (!$sigfd) { # wake up every second to accept signals if we don't # have signalfd or IO::KQueue: - sig_setmask($oldset); + PublicInbox::Sigfd::set_sigmask($oldset); PublicInbox::DS->SetLoopTimeout(1000); } PublicInbox::DS->EventLoop;