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

FreeSWITCH SVN anthm at freeswitch.org
Wed Mar 25 13:07:41 PDT 2009


Author: anthm
Date: Wed Mar 25 15:07:40 2009
New Revision: 12784

Log:
rearrange hangup callflow to do more work in the session's own thread

Modified:
   freeswitch/trunk/src/include/switch_channel.h
   freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
   freeswitch/trunk/src/switch_channel.c
   freeswitch/trunk/src/switch_core_state_machine.c

Modified: freeswitch/trunk/src/include/switch_channel.h
==============================================================================
--- freeswitch/trunk/src/include/switch_channel.h	(original)
+++ freeswitch/trunk/src/include/switch_channel.h	Wed Mar 25 15:07:40 2009
@@ -511,6 +511,7 @@
 SWITCH_DECLARE(void) switch_channel_set_app_flag(switch_channel_t *channel, uint32_t flags);
 SWITCH_DECLARE(void) switch_channel_clear_app_flag(switch_channel_t *channel, uint32_t flags);
 SWITCH_DECLARE(int) switch_channel_test_app_flag(switch_channel_t *channel, uint32_t flags);
+SWITCH_DECLARE(void) switch_channel_set_hangup_time(switch_channel_t *channel);
 
 /** @} */
 

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	Wed Mar 25 15:07:40 2009
@@ -209,7 +209,7 @@
 			free(buf);
 		}
 	}
-
+	
 	g_template_str = (const char *) switch_core_hash_find(globals.template_hash, globals.default_template);
 
 	if ((accountcode = switch_channel_get_variable(channel, "ACCOUNTCODE"))) {

Modified: freeswitch/trunk/src/switch_channel.c
==============================================================================
--- freeswitch/trunk/src/switch_channel.c	(original)
+++ freeswitch/trunk/src/switch_channel.c	Wed Mar 25 15:07:40 2009
@@ -609,10 +609,12 @@
 SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_var_check(switch_channel_t *channel, 
 																	  const char *varname, const char *value, switch_bool_t var_check)
 {
+	switch_status_t status = SWITCH_STATUS_FALSE;
+	
 	switch_assert(channel != NULL);
 
+	switch_mutex_lock(channel->profile_mutex);
 	if (channel->variables && !switch_strlen_zero(varname)) {
-		switch_mutex_lock(channel->profile_mutex);
 		switch_event_del_header(channel->variables, varname);
 		if (!switch_strlen_zero(value)) {
 			int ok = 1;
@@ -626,11 +628,11 @@
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Invalid data (${%s} contains a variable)\n", varname);
 			}
 		}
-		switch_mutex_unlock(channel->profile_mutex);
-		return SWITCH_STATUS_SUCCESS;
+		status = SWITCH_STATUS_SUCCESS;
 	}
+	switch_mutex_unlock(channel->profile_mutex);
 
-	return SWITCH_STATUS_FALSE;
+	return status;
 }
 
 switch_status_t switch_event_base_add_header(switch_event_t *event, switch_stack_t stack, const char *header_name, char *data);
@@ -640,10 +642,12 @@
 	int ret = 0;
 	char *data;
 	va_list ap;
+	switch_status_t status = SWITCH_STATUS_FALSE;
+
 	switch_assert(channel != NULL);
 
+	switch_mutex_lock(channel->profile_mutex);
 	if (channel->variables && !switch_strlen_zero(varname)) {
-		switch_mutex_lock(channel->profile_mutex);
 		switch_event_del_header(channel->variables, varname);
 
 		va_start(ap, fmt);
@@ -657,11 +661,11 @@
 
 		switch_event_base_add_header(channel->variables, SWITCH_STACK_BOTTOM, varname, data);
 
-		switch_mutex_unlock(channel->profile_mutex);
-		return SWITCH_STATUS_SUCCESS;
+		status = SWITCH_STATUS_SUCCESS;
 	}
+	switch_mutex_unlock(channel->profile_mutex);
 
-	return SWITCH_STATUS_FALSE;
+	return status;
 }
 
 
@@ -1582,6 +1586,16 @@
 }
 
 
+SWITCH_DECLARE(void) switch_channel_set_hangup_time(switch_channel_t *channel)
+{
+	if (channel->caller_profile && channel->caller_profile->times && !channel->caller_profile->times->hungup) {
+		switch_mutex_lock(channel->profile_mutex);
+		channel->caller_profile->times->hungup = switch_micro_time_now();
+		switch_mutex_unlock(channel->profile_mutex);
+	}
+}
+
+
 SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_channel_t *channel,
 																	 const char *file, const char *func, int line, switch_call_cause_t hangup_cause)
 {
@@ -1590,17 +1604,8 @@
 	switch_channel_clear_flag(channel, CF_BLOCK_STATE);
 	
 	if (channel->state < CS_HANGUP) {
-		switch_event_t *event;
 		switch_channel_state_t last_state = channel->state;
 
-		if (channel->caller_profile && channel->caller_profile->times && !channel->caller_profile->times->hungup) {
-			switch_mutex_lock(channel->profile_mutex);
-			channel->caller_profile->times->hungup = switch_micro_time_now();
-			switch_mutex_unlock(channel->profile_mutex);
-		}
-		
-		switch_channel_stop_broadcast(channel);
-
 		switch_mutex_lock(channel->state_mutex);
 		channel->state = CS_HANGUP;
 		switch_mutex_unlock(channel->state_mutex);
@@ -1608,21 +1613,9 @@
 		channel->hangup_cause = hangup_cause;
 		switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_NOTICE, "Hangup %s [%s] [%s]\n",
 						  channel->name, state_names[last_state], switch_channel_cause2str(channel->hangup_cause));
-		
-		switch_channel_set_variable(channel, "hangup_cause", switch_channel_cause2str(channel->hangup_cause));
-		switch_channel_presence(channel, "unavailable", switch_channel_cause2str(channel->hangup_cause), NULL);
 
 		switch_core_session_kill_channel(channel->session, SWITCH_SIG_KILL);
 		switch_core_session_signal_state_change(channel->session);
-
-		switch_channel_set_timestamps(channel);
-
-		if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_HANGUP) == SWITCH_STATUS_SUCCESS) {
-			switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Hangup-Cause", switch_channel_cause2str(channel->hangup_cause));
-			switch_channel_event_set_data(channel, event);
-			switch_event_fire(&event);
-		}
-
 	}
 
 	return channel->state;

Modified: freeswitch/trunk/src/switch_core_state_machine.c
==============================================================================
--- freeswitch/trunk/src/switch_core_state_machine.c	(original)
+++ freeswitch/trunk/src/switch_core_state_machine.c	Wed Mar 25 15:07:40 2009
@@ -424,8 +424,19 @@
 				{
 					const char *hook_var;
 					switch_core_session_t *use_session = NULL;
-					
+					switch_call_cause_t cause = switch_channel_get_cause(session->channel);
+					switch_event_t *event;
+		
+					switch_channel_set_hangup_time(session->channel);
+
 					switch_core_media_bug_remove_all(session);
+				
+					switch_channel_stop_broadcast(session->channel);
+					
+					switch_channel_set_variable(session->channel, "hangup_cause", switch_channel_cause2str(cause));
+					switch_channel_presence(session->channel, "unavailable", switch_channel_cause2str(cause), NULL);
+					
+					switch_channel_set_timestamps(session->channel);
 					
 					STATE_MACRO(hangup, "HANGUP");
 
@@ -462,8 +473,16 @@
 						}
 						switch_safe_free(stream.data);
 					}
+
+					if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_HANGUP) == SWITCH_STATUS_SUCCESS) {
+						switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Hangup-Cause", switch_channel_cause2str(cause));
+						switch_channel_event_set_data(session->channel, event);
+						switch_event_fire(&event);
+					}
+				
+					switch_channel_set_state(session->channel, CS_REPORTING);
 				}
-				switch_channel_set_state(session->channel, CS_REPORTING);
+
 				break;
 			case CS_INIT:		/* Basic setup tasks */
 				STATE_MACRO(init, "INIT");



More information about the Freeswitch-svn mailing list