Notice errors writing out the PID file and abort
[catagits/FCGI-ProcManager.git] / lib / FCGI / ProcManager.pm
index d6c0df6..c1c4023 100644 (file)
@@ -13,14 +13,14 @@ use POSIX qw(:signal_h);
 
 use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS $Q $SIG_CODEREF);
 BEGIN {
-  $VERSION = '0.19'; 
+  $VERSION = '0.24';
   @ISA = qw(Exporter);
   @EXPORT_OK = qw(pm_manage pm_die pm_wait
-                 pm_write_pid_file pm_remove_pid_file
-                 pm_pre_dispatch pm_post_dispatch
-                 pm_change_process_name pm_received_signal pm_parameter 
-                 pm_warn pm_notify pm_abort pm_exit
-                 $SIG_CODEREF);
+          pm_write_pid_file pm_remove_pid_file
+          pm_pre_dispatch pm_post_dispatch
+          pm_change_process_name pm_received_signal pm_parameter 
+          pm_warn pm_notify pm_abort pm_exit
+          $SIG_CODEREF);
   $EXPORT_TAGS{all} = \@EXPORT_OK;
   $FCGI::ProcManager::Default = 'FCGI::ProcManager';
 }
@@ -35,7 +35,7 @@ BEGIN {
  use CGI::Fast;
  use FCGI::ProcManager;
  my $proc_manager = FCGI::ProcManager->new({
-       n_processes => 10
+    n_processes => 10
  });
  $proc_manager->pm_manage();
  while (my $cgi = CGI::Fast->new()) {
@@ -47,7 +47,7 @@ BEGIN {
  # This style is also supported:
  use CGI::Fast;
  use FCGI::ProcManager qw(pm_manage pm_pre_dispatch
-                         pm_post_dispatch);
+              pm_post_dispatch);
  pm_manage( n_processes => 10 );
  while (my $cgi = CGI::Fast->new()) {
    pm_pre_dispatch();
@@ -133,12 +133,12 @@ sub new {
   $init ||= {};
 
   my $this = { 
-             role => "manager",
-             start_delay => 0,
-             die_timeout => 60,
+          role => "manager",
+          start_delay => 0,
+          die_timeout => 60,
         pm_title => 'perl-fcgi-pm',
-             %$init
-            };
+          %$init
+         };
   bless $this, ref($proto)||$proto;
 
   $this->{PIDS} = {};
@@ -146,9 +146,9 @@ sub new {
   # initialize signal constructions.
   unless ($this->no_signals()) {
     $this->{sigaction_no_sa_restart} =
-       POSIX::SigAction->new('FCGI::ProcManager::sig_sub');
+    POSIX::SigAction->new('FCGI::ProcManager::sig_sub');
     $this->{sigaction_sa_restart} =
-       POSIX::SigAction->new('FCGI::ProcManager::sig_sub',undef,POSIX::SA_RESTART);
+    POSIX::SigAction->new('FCGI::ProcManager::sig_sub',undef,POSIX::SA_RESTART);
   }
 
   return $this;
@@ -181,6 +181,9 @@ sub pm_manage {
   my ($this,%values) = self_or_default(@_);
   map { $this->pm_parameter($_,$values{$_}) } keys %values;
 
+  local $SIG{CHLD}; # Replace the SIGCHLD default handler in case
+                    # somebody shit on it whilst loading code.
+
   # skip to handling now if we won't be managing any processes.
   $this->n_processes() or return;
 
@@ -200,20 +203,20 @@ sub pm_manage {
   PIDS: while (keys(%{$this->{PIDS}}) < $this->n_processes()) {
 
       if (my $pid = fork()) {
-       # the manager remembers the server.
-       $this->{PIDS}->{$pid} = { pid=>$pid };
+    # the manager remembers the server.
+    $this->{PIDS}->{$pid} = { pid=>$pid };
         $this->pm_notify("server (pid $pid) started");
 
       } elsif (! defined $pid) {
-       return $this->pm_abort("fork: $!");
+    return $this->pm_abort("fork: $!");
 
       } else {
-       $this->{MANAGER_PID} = $manager_pid;
-       # the server exits the managing loop.
-       last MANAGING_LOOP;
+    $this->{MANAGER_PID} = $manager_pid;
+    # the server exits the managing loop.
+    last MANAGING_LOOP;
       }
 
-      for (my $s = $this->start_delay(); $s; $s = sleep $s) {};
+      for (my $s = $this->start_delay(); $s > 0; $s -= sleep $s) {};
     }
 
     # this should block until the next server dies.
@@ -256,9 +259,9 @@ sub managing_init {
   # -- we want start the shutdown sequence immediately upon SIGTERM.
   unless ($this->no_signals()) {
     sigaction(SIGTERM, $this->{sigaction_no_sa_restart}) or
-       $this->pm_warn("sigaction: SIGTERM: $!");
+    $this->pm_warn("sigaction: SIGTERM: $!");
     sigaction(SIGHUP,  $this->{sigaction_no_sa_restart}) or
-       $this->pm_warn("sigaction: SIGHUP: $!");
+    $this->pm_warn("sigaction: SIGHUP: $!");
     $SIG_CODEREF = sub { $this->sig_manager(@_) };
   }
 
@@ -332,7 +335,7 @@ sub pm_wait {
   my ($this) = self_or_default(@_);
 
   # wait for the next server to die.
-  next if (my $pid = wait()) < 0;
+  return if ((my $pid = wait()) < 0);
 
   # notify when one of our servers have died.
   delete $this->{PIDS}->{$pid} and
@@ -356,12 +359,13 @@ specified, it uses the value of the C<pid_fname> parameter.
 sub pm_write_pid_file {
   my ($this,$fname) = self_or_default(@_);
   $fname ||= $this->pid_fname() or return;
-  if (!open PIDFILE, ">$fname") {
+  my $PIDFILE
+  if (!open $PIDFILE, ">$fname") {
     $this->pm_warn("open: $fname: $!");
     return;
   }
-  print PIDFILE "$$\n";
-  close PIDFILE;
+  print $PIDFILE "$$\n" or die "Could not print PID: $!";
+  close $PIDFILE or die "Could not close PID file";
 }
 
 =head2 pm_remove_pid_file
@@ -531,7 +535,7 @@ default object if one is not passed in, e.g., a method call.
 sub self_or_default {
   return @_ if defined $_[0] and !ref $_[0] and $_[0] eq 'FCGI::ProcManager';
   if (!defined $_[0] or (ref($_[0]) ne 'FCGI::ProcManager' and
-                        !UNIVERSAL::isa($_[0],'FCGI::ProcManager'))) {
+             !UNIVERSAL::isa($_[0],'FCGI::ProcManager'))) {
     $Q or $Q = $FCGI::ProcManager::Default->new;
     unshift @_, $Q;
   }