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';
}
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()) {
# 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();
$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} = {};
# 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;
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;
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.
# -- 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(@_) };
}
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
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
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;
}