[Freeswitch-svn] [commit] r9573 - in freeswitch/trunk/src: . include mod/event_handlers/mod_cdr_csv mod/xml_int/mod_xml_cdr

Freeswitch SVN anthm at freeswitch.org
Tue Sep 16 13:12:15 EDT 2008


Author: anthm
Date: Tue Sep 16 13:12:14 2008
New Revision: 9573

Modified:
   freeswitch/trunk/src/include/switch_core.h
   freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
   freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
   freeswitch/trunk/src/switch_core.c

Log:
improve shutdown/unload

Modified: freeswitch/trunk/src/include/switch_core.h
==============================================================================
--- freeswitch/trunk/src/include/switch_core.h	(original)
+++ freeswitch/trunk/src/include/switch_core.h	Tue Sep 16 13:12:14 2008
@@ -350,6 +350,8 @@
 */
 SWITCH_DECLARE(int) switch_core_add_state_handler(_In_ const switch_state_handler_table_t *state_handler);
 
+SWITCH_DECLARE(void) switch_core_remove_state_handler(_In_ const switch_state_handler_table_t *state_handler);
+
 /*! 
   \brief Access a state handler
   \param index the desired index to access

Modified: freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
==============================================================================
--- freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c	(original)
+++ freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c	Tue Sep 16 13:12:14 2008
@@ -60,7 +60,7 @@
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_csv_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown);
-SWITCH_MODULE_DEFINITION(mod_cdr_csv, mod_cdr_csv_load, NULL, NULL);
+SWITCH_MODULE_DEFINITION(mod_cdr_csv, mod_cdr_csv_load, mod_cdr_csv_shutdown, NULL);
 
 static off_t fd_size(int fd)
 {
@@ -172,6 +172,10 @@
 	const char *log_dir = NULL, *accountcode = NULL, *a_template_str = NULL, *g_template_str = NULL;
 	char *log_line, *path = NULL;
 
+	if (globals.shutdown) {
+		return SWITCH_STATUS_SUCCESS;
+	}
+
 	if (!((globals.legs & CDR_LEG_A) && (globals.legs & CDR_LEG_B))) {
 		if ((globals.legs & CDR_LEG_A)) {
 			if (switch_channel_get_originator_caller_profile(channel)) {
@@ -258,6 +262,10 @@
 	void *val;
 	cdr_fd_t *fd;
 
+	if (globals.shutdown) {
+		return;
+	}
+
 	if (sig && !strcmp(sig, "HUP")) {
 		for (hi = switch_hash_first(NULL, globals.fd_hash); hi; hi = switch_hash_next(hi)) {
 			switch_hash_this(hi, NULL, NULL, &val);
@@ -384,7 +392,11 @@
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown)
 {
 
-	globals.shutdown = 1;
+	globals.shutdown = 1;	
+	switch_event_unbind_callback(event_handler);
+	switch_core_remove_state_handler(&state_handlers);
+
+
 	return SWITCH_STATUS_SUCCESS;
 }
 

Modified: freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
==============================================================================
--- freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c	(original)
+++ freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c	Tue Sep 16 13:12:14 2008
@@ -78,6 +78,10 @@
 	switch_channel_t *channel = switch_core_session_get_channel(session);
 	switch_status_t status = SWITCH_STATUS_FALSE;
 
+	if (globals.shutdown) {
+		return SWITCH_STATUS_SUCCESS;
+	}
+
 	if (!globals.log_b && channel && switch_channel_get_originator_caller_profile(channel)) {
 		return SWITCH_STATUS_SUCCESS;
 	}
@@ -344,6 +348,8 @@
 {
 
 	globals.shutdown = 1;
+	
+	switch_core_remove_state_handler(&state_handlers);
 	return SWITCH_STATUS_SUCCESS;
 }
 

Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c	(original)
+++ freeswitch/trunk/src/switch_core.c	Tue Sep 16 13:12:14 2008
@@ -163,15 +163,46 @@
 	return handle;
 }
 
+SWITCH_DECLARE(void) switch_core_remove_state_handler(const switch_state_handler_table_t *state_handler)
+{
+	int index, total = 0;
+	const switch_state_handler_table_t *tmp[SWITCH_MAX_STATE_HANDLERS+1] = { 0 };
+	
+	switch_mutex_lock(runtime.global_mutex);
+
+	for (index = 0; index < runtime.state_handler_index; index++) {
+		const switch_state_handler_table_t *cur = runtime.state_handlers[index];
+		runtime.state_handlers[index] = NULL;
+		if (cur == state_handler) {
+			continue;
+		}
+		tmp[index] = runtime.state_handlers[index];
+		total++;
+	}
+
+	runtime.state_handler_index = 0;
+
+	for (index = 0; index < total; index++) {
+		runtime.state_handlers[runtime.state_handler_index++] = tmp[index];
+	}
+	switch_mutex_unlock(runtime.global_mutex);
+}
+
+
 SWITCH_DECLARE(int) switch_core_add_state_handler(const switch_state_handler_table_t *state_handler)
 {
-	int index = runtime.state_handler_index++;
+	int index;
+
+	switch_mutex_lock(runtime.global_mutex);
+	index = runtime.state_handler_index++;
 
 	if (runtime.state_handler_index >= SWITCH_MAX_STATE_HANDLERS) {
-		return -1;
+		index = -1;
+	} else {
+		runtime.state_handlers[index] = state_handler;
 	}
 
-	runtime.state_handlers[index] = state_handler;
+	switch_mutex_unlock(runtime.global_mutex);
 	return index;
 }
 



More information about the Freeswitch-svn mailing list