[LON-CAPA-cvs] cvs: loncom / loncnew
foxr
lon-capa-cvs@mail.lon-capa.org
Tue, 05 Oct 2004 10:10:31 -0000
foxr Tue Oct 5 06:10:31 2004 EDT
Modified files:
/loncom loncnew
Log:
Factor out all the paths in the child that can exit and ensure they
create lock files for the unix domain socket if die when idle is turned
on. Still need signal handling so DO NOT turn on DieWhenIdle unless
you don't care about that.
Index: loncom/loncnew
diff -u loncom/loncnew:1.63 loncom/loncnew:1.64
--- loncom/loncnew:1.63 Mon Oct 4 07:30:45 2004
+++ loncom/loncnew Tue Oct 5 06:10:31 2004
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# lonc maintains the connections to remote computers
#
-# $Id: loncnew,v 1.63 2004/10/04 11:30:45 foxr Exp $
+# $Id: loncnew,v 1.64 2004/10/05 10:10:31 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -302,6 +302,44 @@
}
}
+#
+# This function should be called by the child in all cases where it must
+# exit. If the child process is running with the DieWhenIdle turned on
+# it must create a lock file for the AF_UNIX socket in order to prevent
+# connection requests from lonnet in the time between process exit
+# and the parent picking up the listen again.
+# Parameters:
+# exit_code - Exit status value, however see the next parameter.
+# message - If this optional parameter is supplied, the exit
+# is via a die with this message.
+#
+sub child_exit {
+ my ($exit_code, $message) = @_;
+
+ # Regardless of how we exit, we may need to do the lock thing:
+
+ if($DieWhenIdle) {
+ #
+ # Create a lock file since there will be a time window
+ # between our exit and the parent's picking up the listen
+ # during which no listens will be done on the
+ # lonnet client socket.
+ #
+ my $lock_file = GetLoncSocketPath().".lock";
+ open(LOCK,">$lock_file");
+ print LOCK "Contents not important";
+ close(LOCK);
+
+ exit(0);
+ }
+ # Now figure out how we exit:
+
+ if($message) {
+ die $message;
+ } else {
+ exit($exit_code);
+ }
+}
#----------------------------- Timer management ------------------------
=pod
@@ -332,18 +370,8 @@
$IdleSeconds = 0; # Otherwise all connections get trimmed to fast.
UpdateStatus();
if(($ConnectionCount == 0) && $DieWhenIdle) {
- #
- # Create a lock file since there will be a time window
- # between our exit and the parent's picking up the listen
- # during which no listens will be done on the
- # lonnet client socket.
- #
- my $lock_file = GetLoncSocketPath().".lock";
- open(LOCK,">$lock_file");
- print LOCK "Contents not important";
- close(LOCK);
-
- exit(0);
+ &child_exit(0);
+
}
}
} else {
@@ -1177,7 +1205,7 @@
#
my $Socket = $Connection->GetSocket();
if($Socket eq undef) {
- die "did not get a socket from the connection";
+ &child_exit(-1, "did not get a socket from the connection");
} else {
&Debug(9,"MakeLondConnection got socket: ".$Socket);
}
@@ -1491,7 +1519,11 @@
unless ($socket =IO::Socket::UNIX->new(Local => $SocketName,
Listen => 250,
Type => SOCK_STREAM)) {
- die "Failed to create a lonc listner socket";
+ if($I_am_child) {
+ &child_exit(-1, "Failed to create a lonc listener socket");
+ } else {
+ die "Failed to create a lonc listner socket";
+ }
}
return $socket;
}
@@ -1621,8 +1653,8 @@
undef $parent_dispatchers{$listener};
}
- $I_am_child = 1; # Seems like in spite of it all I'm still getting
- # parent event dispatches.
+ $I_am_child = 1; # Seems like in spite of it all I may still getting
+ # parent event dispatches.. flag I'm a child.
#
@@ -1679,7 +1711,7 @@
my $ret = Event::loop(); # Start the main event loop.
- die "Main event loop exited!!!";
+ &child_exit (-1,"Main event loop exited!!!");
}
# Create a new child for host passed in: