Revision
16532
Author
anthm
Date
2010-01-28 12:21:27 -0600 (Thu, 28 Jan 2010)

Log Message

refactor

Modified Paths

Diff

Modified: freeswitch/trunk/src/switch_ivr.c (16531 => 16532)


--- freeswitch/trunk/src/switch_ivr.c	2010-01-28 17:46:57 UTC (rev 16531)
+++ freeswitch/trunk/src/switch_ivr.c	2010-01-28 18:21:27 UTC (rev 16532)
@@ -1263,48 +1263,39 @@
 			swap = 1;
 		}
 
+		switch_channel_set_flag(channel, CF_REDIRECT);
+		switch_channel_set_flag(channel, CF_RESET);
+		
 		if ((flags & SMF_FORCE) || !switch_channel_test_flag(channel, CF_PROXY_MODE)) {
-			switch_channel_set_flag(channel, CF_RESET);
-			switch_channel_set_flag(channel, CF_REDIRECT);
-			switch_channel_set_state(channel, CS_PARK);
-			switch_channel_set_flag(channel, CF_TRANSFER);
-
-			switch_core_session_receive_message(session, &msg);
-
 			if ((flags & SMF_REBRIDGE) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE)) &&
 				(other_session = switch_core_session_locate(other_uuid))) {
 				other_channel = switch_core_session_get_channel(other_session);
+
 				switch_channel_set_flag(other_channel, CF_RESET);
 				switch_channel_set_flag(other_channel, CF_REDIRECT);
 				switch_channel_set_state(other_channel, CS_PARK);
-				switch_channel_set_flag(other_channel, CF_TRANSFER);
-				
-				
+				switch_channel_wait_for_state(other_channel, channel, CS_PARK);
 				switch_core_session_receive_message(other_session, &msg);
-				switch_channel_clear_state_handler(other_channel, NULL);
 			}
+			
+			switch_core_session_receive_message(session, &msg);
 
-			if (other_channel) {
-				switch_channel_wait_for_state(other_channel, channel, CS_PARK);
+			if (!switch_core_session_in_thread(session)) {
+				switch_channel_set_state(channel, CS_PARK);
+				switch_channel_wait_for_state(channel, channel, CS_PARK);
 			}
-			if (switch_core_session_in_thread(session)) {
-				switch_yield(100000);
-			}
 			
-			switch_channel_clear_flag(channel, CF_NOT_READY);
-
 			if (other_channel) {
-				switch_channel_clear_flag(other_channel, CF_NOT_READY);
-				
-				switch_channel_clear_state_handler(channel, NULL);
 				if (swap) {
 					switch_ivr_signal_bridge(other_session, session);
 				} else {
 					switch_ivr_signal_bridge(session, other_session);
 				}
+
 				switch_channel_wait_for_state(other_channel, channel, CS_HIBERNATE);
-				if (switch_core_session_in_thread(session)) {
-					switch_yield(100000);
+
+				if (!switch_core_session_in_thread(session)) {
+					switch_channel_wait_for_state(channel, other_channel, CS_HIBERNATE);
 				}
 				switch_core_session_rwunlock(other_session);
 			}