changeset 1190:6a1042d8075b

Replace FDEV_TERMINATE events with calls to fd_core_shutdown to handle the core state properly
author Sebastien Decugis <sdecugis@freediameter.net>
date Mon, 10 Jun 2013 16:44:18 +0800
parents 50bf33dc8fe0
children 60e7b02a3ce7
files extensions/app_radgw/rgw_clients.c extensions/test_netemul/tne_process.c include/freeDiameter/libfdcore.h libfdcore/cnxctx.c libfdcore/core.c libfdcore/events.c libfdcore/p_cnx.c libfdcore/p_expiry.c libfdcore/routing_dispatch.c libfdcore/sctp3436.c libfdcore/server.c
diffstat 11 files changed, 20 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/extensions/app_radgw/rgw_clients.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/extensions/app_radgw/rgw_clients.c	Mon Jun 10 16:44:18 2013 +0800
@@ -203,7 +203,7 @@
 	}
 	
 	/* If we reach this part, some fatal error was encountered */
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	TRACE_DEBUG(FULL, "Thread terminated");	
 	return NULL;
 }
--- a/extensions/test_netemul/tne_process.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/extensions/test_netemul/tne_process.c	Mon Jun 10 16:44:18 2013 +0800
@@ -280,7 +280,7 @@
 error:
 	TRACE_DEBUG(INFO, "A fatal error occurred in test_netemul/process thread!");
 	ASSERT(0);
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	return NULL;
 }
 
--- a/include/freeDiameter/libfdcore.h	Mon Jun 10 16:23:09 2013 +0800
+++ b/include/freeDiameter/libfdcore.h	Mon Jun 10 16:44:18 2013 +0800
@@ -812,8 +812,8 @@
 
 /* Daemon's codespace: 1000->1999 (1500->1999 defined in fdcore-internal.h) */
 enum {
-	 FDEV_TERMINATE	= 1000	/* request to terminate */
-	,FDEV_TRIGGER		/* Trigger available for extensions. size is sizeof(int), data is int * */
+	 FDEV_TERMINATE_INT= 1000	/* request to terminate. DO NOT USE. Use fd_core_shutdown() instead.  */
+	,FDEV_TRIGGER			/* Trigger available for extensions. size is sizeof(int), data is int * */
 };
 
 int fd_event_send(struct fifo *queue, int code, size_t datasz, void * data);
--- a/libfdcore/cnxctx.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/cnxctx.c	Mon Jun 10 16:44:18 2013 +0800
@@ -610,7 +610,7 @@
 fatal:
 	/* An unrecoverable error occurred, stop the daemon */
 	ASSERT(0);
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );	
+	CHECK_FCT_DO(fd_core_shutdown(), );	
 }
 
 /* Set the timeout option on the socket */
@@ -842,8 +842,7 @@
 		CHECK_FCT_DO( fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), 
 			{ 
 				free_rcvdata(&rcv_data);
-				CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
-				return NULL; 
+				goto fatal; 
 			} );
 		
 	} while (conn->cc_loop);
@@ -854,7 +853,7 @@
 	
 fatal:
 	/* An unrecoverable error occurred, stop the daemon */
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	goto out;
 }
 
@@ -907,7 +906,7 @@
 
 fatal:
 	/* An unrecoverable error occurred, stop the daemon */
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	goto out;
 }
 #endif /* DISABLE_SCTP */
@@ -1098,7 +1097,7 @@
 		CHECK_FCT_DO( ret = fd_event_send( fd_cnx_target_queue(conn), FDEVP_CNX_MSG_RECV, rcv_data.length, rcv_data.buffer), 
 			{ 
 				free_rcvdata(&rcv_data);
-				CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+				CHECK_FCT_DO(fd_core_shutdown(), );
 				return ret; 
 			} );
 		
--- a/libfdcore/core.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/core.c	Mon Jun 10 16:44:18 2013 +0800
@@ -148,7 +148,7 @@
 				}
 				break;
 			
-			case FDEV_TERMINATE:
+			case FDEV_TERMINATE_INT:
 				goto end;
 			
 			default:
@@ -326,6 +326,8 @@
 {
 	enum core_state cur_state = core_state_get();
 	
+	LOG_F("Initiating freeDiameter shutdown sequence (%d)", cur_state);
+		
 	if (cur_state < CORE_RUNNING) {
 		/* Calling application must make sure the initialization is not ongoing in a separate thread... */
 		if (pthread_mutex_lock(&core_lock) != 0) {
@@ -338,7 +340,7 @@
 		pthread_mutex_unlock(&core_lock);
 	} else if (cur_state == CORE_RUNNING) {
 		core_state_set(CORE_SHUTDOWN);
-		CHECK_FCT( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL) );
+		CHECK_FCT( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE_INT, 0, NULL) );
 	}
 	
 	/* Other case, the framework is already shutting down */
--- a/libfdcore/events.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/events.c	Mon Jun 10 16:44:18 2013 +0800
@@ -104,7 +104,7 @@
 	switch (event) {
 	#define case_str( _val )\
 		case _val : return #_val
-		case_str(FDEV_TERMINATE);
+		case_str(FDEV_TERMINATE_INT);
 		case_str(FDEV_TRIGGER);
 		
 		default:
--- a/libfdcore/p_cnx.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/p_cnx.c	Mon Jun 10 16:44:18 2013 +0800
@@ -313,7 +313,7 @@
 			fd_cnx_destroy(cnx);
 
 		/* Generate a termination event */
-		CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+		CHECK_FCT_DO(fd_core_shutdown(), );
 	}
 	
 	return NULL;
--- a/libfdcore/p_expiry.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/p_expiry.c	Mon Jun 10 16:44:18 2013 +0800
@@ -86,7 +86,7 @@
 error:
 	TRACE_DEBUG(INFO, "An error occurred in peers module! GC thread is terminating...");
 	ASSERT(0);
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	return NULL;
 }
 
@@ -138,7 +138,7 @@
 	pthread_cleanup_pop( 1 );
 
 	TRACE_DEBUG(INFO, "An error occurred in peers module! Expiry thread is terminating...");
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	return NULL;
 }
 
--- a/libfdcore/routing_dispatch.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/routing_dispatch.c	Mon Jun 10 16:44:18 2013 +0800
@@ -1114,7 +1114,7 @@
 	
 fatal_error:
 	TRACE_DEBUG(INFO, "An unrecoverable error occurred, %s thread is terminating...", action_name);
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	
 end:	
 	; /* noop so that we get rid of "label at end of compund statement" warning */
--- a/libfdcore/sctp3436.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/sctp3436.c	Mon Jun 10 16:44:18 2013 +0800
@@ -129,7 +129,7 @@
 	
 fatal:
 	/* An unrecoverable error occurred, stop the daemon */
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 	goto out;
 }
 
--- a/libfdcore/server.c	Mon Jun 10 16:23:09 2013 +0800
+++ b/libfdcore/server.c	Mon Jun 10 16:44:18 2013 +0800
@@ -303,7 +303,7 @@
 
 	/* Send error signal to the core */
 	LOG_F( "An error occurred in server module! Thread is terminating...");
-	CHECK_FCT_DO(fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), );
+	CHECK_FCT_DO(fd_core_shutdown(), );
 
 	return NULL;
 }
"Welcome to our mercurial repository"