[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: