version 1.62, 2004/10/04 10:30:50
|
version 1.63, 2004/10/04 11:30:45
|
Line 1716 sub CreateChild {
|
Line 1716 sub CreateChild {
|
# a connection request arrives. We must: |
# a connection request arrives. We must: |
# Start a child process to accept the connection request. |
# Start a child process to accept the connection request. |
# Kill our listen on the socket. |
# Kill our listen on the socket. |
# Setup an event to handle the child process exit. (SIGCHLD). |
|
# Parameter: |
# Parameter: |
# event - The event object that was created to monitor this socket. |
# event - The event object that was created to monitor this socket. |
# event->w->fd is the socket. |
# event->w->fd is the socket. |
Line 1821 sub listen_on_all_unix_sockets {
|
Line 1820 sub listen_on_all_unix_sockets {
|
} |
} |
} |
} |
|
|
|
# server_died is called whenever a child process exits. |
|
# Since this is dispatched via a signal, we must process all |
|
# dead children until there are no more left. The action |
|
# is to: |
|
# - Remove the child from the bookeeping hashes |
|
# - Re-establish a listen on the unix domain socket associated |
|
# with that host. |
|
# Parameters: |
|
# The event, but we don't actually care about it. |
|
sub server_died { |
|
&Debug(9, "server_died called..."); |
|
|
|
while(1) { # Loop until waitpid nowait fails. |
|
my $pid = waitpid(-1, WNOHANG); |
|
if($pid <= 0) { |
|
return; # Nothing left to wait for. |
|
} |
|
# need the host to restart: |
|
|
|
my $host = $ChildHash{$pid}; |
|
if($host) { # It's for real... |
|
&Debug(9, "Caught sigchild for $host"); |
|
delete($ChildHash{$pid}); |
|
delete($HostToPid{$host}); |
|
&parent_listen($host); |
|
|
|
} else { |
|
&Debug(5, "Caught sigchild for pid not in hosts hash: $pid"); |
|
} |
|
} |
|
|
|
} |
|
|
# |
# |
# Parent process logic pass 1: |
# Parent process logic pass 1: |
# For each entry in the hosts table, we will |
# For each entry in the hosts table, we will |
Line 1893 ShowStatus("Parent keeping the flock");
|
Line 1925 ShowStatus("Parent keeping the flock");
|
|
|
|
|
if ($DieWhenIdle) { |
if ($DieWhenIdle) { |
|
# We need to setup a SIGChild event to handle the exit (natural or otherwise) |
|
# of the children. |
|
|
|
Event->signal(cb => \&server_died, |
|
desc => "Child exit handler", |
|
signal => "CHLD"); |
|
|
|
|
$Event::DebugLevel = $DebugLevel; |
$Event::DebugLevel = $DebugLevel; |
Debug(9, "Parent entering event loop"); |
Debug(9, "Parent entering event loop"); |
my $ret = Event::loop(); |
my $ret = Event::loop(); |