[Opensrf-commits] r1089 - trunk/src/libopensrf

svn at svn.open-ils.org svn at svn.open-ils.org
Sun Sep 2 13:42:43 EDT 2007


Author: miker
Date: 2007-09-02 13:36:15 -0400 (Sun, 02 Sep 2007)
New Revision: 1089

Modified:
   trunk/src/libopensrf/osrf_system.c
Log:
Patch from Scott McKellar to log service name on child process startup and exit, along with more exit status info

Modified: trunk/src/libopensrf/osrf_system.c
===================================================================
--- trunk/src/libopensrf/osrf_system.c	2007-08-30 18:56:46 UTC (rev 1088)
+++ trunk/src/libopensrf/osrf_system.c	2007-09-02 17:36:15 UTC (rev 1089)
@@ -5,9 +5,27 @@
 
 static int _osrfSystemInitCache( void );
 static void report_child_status( pid_t pid, int status );
+struct child_node;
+typedef struct child_node ChildNode;
 
+struct child_node
+{
+	ChildNode* pNext;
+	ChildNode* pPrev;
+	pid_t pid;
+	char* app;
+	char* libfile;
+};
+
+static ChildNode* child_list;
+
 static transport_client* osrfGlobalTransportClient = NULL;
 
+static void add_child( pid_t pid, const char* app, const char* libfile );
+static void delete_child( ChildNode* node );
+static void delete_all_children( void );
+static ChildNode* seek_child( pid_t pid );
+
 transport_client* osrfSystemGetTransportClient( void ) {
 	return osrfGlobalTransportClient;
 }
@@ -123,8 +141,10 @@
 				pid_t pid;
 		
 				if( (pid = fork()) ) { 
-					// storage pid in local table for re-launching dead children...
-					osrfLogInfo( OSRF_LOG_MARK, "Launched application child %ld", (long) pid);
+					// store pid in local list for re-launching dead children...
+					add_child( pid, appname, libfile );
+					osrfLogInfo( OSRF_LOG_MARK, "Running application child %s: process id %ld",
+								 appname, (long) pid );
 	
 				} else {
 		
@@ -154,34 +174,127 @@
 		}
 	}
 
+	delete_all_children();
 	return 0;
 }
 
 
-static void report_child_status( pid_t pid, int status ) {
+static void report_child_status( pid_t pid, int status )
+{
+	const char* app;
+	const char* libfile;
+	ChildNode* node = seek_child( pid );
+
+	if( node ) {
+		app     = node->app     ? node->app     : "[unknown]";
+		libfile = node->libfile ? node->libfile : "[none]";
+	} else
+		app = libfile = NULL;
 	
 	if( WIFEXITED( status ) )
 	{
 		int rc = WEXITSTATUS( status );  // return code of child process
 		if( rc )
-			osrfLogError( OSRF_LOG_MARK, "Child process %ld exited with return code %d",
-						  (long) pid, rc );
+			osrfLogError( OSRF_LOG_MARK, "Child process %ld (app %s) exited with return code %d",
+						  (long) pid, app, rc );
 		else
-			osrfLogError( OSRF_LOG_MARK, "Child process %ld exited normally", (long) pid );
+			osrfLogError( OSRF_LOG_MARK, "Child process %ld (app %s) exited normally",
+						  (long) pid, app );
 	}
 	else if( WIFSIGNALED( status ) )
 	{
-		osrfLogError( OSRF_LOG_MARK, "Child process %ld killed by signal %d",
-					  (long) pid, WTERMSIG( status) );
+		osrfLogError( OSRF_LOG_MARK, "Child process %ld (app %s) killed by signal %d",
+					  (long) pid, app, WTERMSIG( status) );
 	}
 	else if( WIFSTOPPED( status ) )
 	{
-		osrfLogError( OSRF_LOG_MARK, "Child process %ld stopped by signal %d",
-					  (long) pid, (int) WSTOPSIG( status ) );
+		osrfLogError( OSRF_LOG_MARK, "Child process %ld (app %s) stopped by signal %d",
+					  (long) pid, app, (int) WSTOPSIG( status ) );
 	}
+
+	delete_child( node );
 }
 
+/*----------- Routines to manage list of children --*/
 
+static void add_child( pid_t pid, const char* app, const char* libfile )
+{
+	/* Construct new child node */
+	
+	ChildNode* node = safe_malloc( sizeof( ChildNode ) );
+
+	node->pid = pid;
+
+	if( app )
+		node->app = strdup( app );
+	else
+		node->app = NULL;
+
+	if( libfile )
+		node->libfile = strdup( libfile );
+	else
+		node->libfile = NULL;
+	
+	/* Add new child node to the head of the list */
+
+	node->pNext = child_list;
+	node->pPrev = NULL;
+
+	if( child_list )
+		child_list->pPrev = node;
+
+	child_list = node;
+}
+
+static void delete_child( ChildNode* node ) {
+
+	/* Sanity check */
+
+	if( ! node )
+		return;
+	
+	/* Detach the node from the list */
+
+	if( node->pPrev )
+		node->pPrev->pNext = node->pNext;
+	else
+		child_list = node->pNext;
+
+	if( node->pNext )
+		node->pNext->pPrev = node->pPrev;
+
+	/* Deallocate the node and its payload */
+
+	free( node->app );
+	free( node->libfile );
+	free( node );
+}
+
+static void delete_all_children( void ) {
+
+	while( child_list )
+		delete_child( child_list );
+}
+
+static ChildNode* seek_child( pid_t pid ) {
+
+	/* Return a pointer to the child node for the */
+	/* specified process ID, or NULL if not found */
+	
+	ChildNode* node = child_list;
+	while( node ) {
+		if( node->pid == pid )
+			break;
+		else
+			node = node->pNext;
+	}
+
+	return node;
+}
+
+/*----------- End of routines to manage list of children --*/
+
+
 int osrf_system_bootstrap_client_resc( char* config_file, char* contextnode, char* resource ) {
 
 	int failure = 0;



More information about the opensrf-commits mailing list