From bfd02beef8f231e42117206437280ceb3478e4f8 Mon Sep 17 00:00:00 2001
From: Mike Jerris <mike@signalwire.com>
Date: Thu, 7 May 2020 11:04:54 -0600
Subject: [PATCH] [core] refactor originate internals (oglobals)

---
 src/switch_ivr_originate.c | 481 +++++++++++++++++++------------------
 1 file changed, 242 insertions(+), 239 deletions(-)

diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c
index 4120513c58..48ec669a31 100644
--- a/src/switch_ivr_originate.c
+++ b/src/switch_ivr_originate.c
@@ -152,6 +152,7 @@ typedef struct {
 	switch_caller_profile_t *caller_profile_override;
 	switch_bool_t check_vars;
 	switch_memory_pool_t *pool;
+	originate_status_t originate_status[MAX_PEERS];// = { {0} };
 } originate_global_t;
 
 
@@ -281,7 +282,7 @@ static void launch_collect_thread(struct key_collect *collect)
 }
 
 static int check_per_channel_timeouts(originate_global_t *oglobals,
-									  originate_status_t *originate_status, int max, time_t start, switch_call_cause_t *force_reason)
+									  int max, time_t start, switch_call_cause_t *force_reason)
 {
 	int x = 0, i, delayed_channels = 0, active_channels = 0;
 	uint32_t early_exit_time = 0, delayed_min = 0;
@@ -289,9 +290,9 @@ static int check_per_channel_timeouts(originate_global_t *oglobals,
 	time_t elapsed = switch_epoch_time_now(NULL) - start;
 
 	for (i = 0; i < max; i++) {
-		if (originate_status[i].peer_channel && switch_channel_get_state(originate_status[i].peer_channel) != CS_DESTROY &&
-			switch_channel_get_state(originate_status[i].peer_channel) != CS_REPORTING) {
-			if (originate_status[i].per_channel_delay_start) {
+		if (oglobals->originate_status[i].peer_channel && switch_channel_get_state(oglobals->originate_status[i].peer_channel) != CS_DESTROY &&
+			switch_channel_get_state(oglobals->originate_status[i].peer_channel) != CS_REPORTING) {
+			if (oglobals->originate_status[i].per_channel_delay_start) {
 				delayed_channels++;
 			} else {
 				active_channels++;
@@ -301,56 +302,56 @@ static int check_per_channel_timeouts(originate_global_t *oglobals,
 
 	if (active_channels == 0 && delayed_channels) {
 		for (i = 0; i < max; i++) {
-			if (originate_status[i].peer_channel && originate_status[i].per_channel_delay_start &&
-				(!delayed_min || delayed_min > originate_status[i].per_channel_delay_start)) {
-				delayed_min = originate_status[i].per_channel_delay_start;
+			if (oglobals->originate_status[i].peer_channel && oglobals->originate_status[i].per_channel_delay_start &&
+				(!delayed_min || delayed_min > oglobals->originate_status[i].per_channel_delay_start)) {
+				delayed_min = oglobals->originate_status[i].per_channel_delay_start;
 			}
 		}
 		early_exit_time = delayed_min - (uint32_t) elapsed;
 	}
 	for (i = 0; i < max; i++) {
-		if (originate_status[i].peer_channel && originate_status[i].per_channel_delay_start &&
-			(elapsed > originate_status[i].per_channel_delay_start || active_channels == 0)) {
+		if (oglobals->originate_status[i].peer_channel && oglobals->originate_status[i].per_channel_delay_start &&
+			(elapsed > oglobals->originate_status[i].per_channel_delay_start || active_channels == 0)) {
 			if (active_channels == 0) {
-				if (originate_status[i].per_channel_timelimit_sec) {
-					if (originate_status[i].per_channel_timelimit_sec > early_exit_time) {
+				if (oglobals->originate_status[i].per_channel_timelimit_sec) {
+					if (oglobals->originate_status[i].per_channel_timelimit_sec > early_exit_time) {
 						/* IN theory this check is not needed ( should just be if !0 then -= with no else), if its not 0 it should always be greater.... */
-						originate_status[i].per_channel_timelimit_sec -= early_exit_time;
+						oglobals->originate_status[i].per_channel_timelimit_sec -= early_exit_time;
 					} else {
-						originate_status[i].per_channel_timelimit_sec = 1;
+						oglobals->originate_status[i].per_channel_timelimit_sec = 1;
 					}
 				}
-				if (originate_status[i].per_channel_progress_timelimit_sec) {
-					if (originate_status[i].per_channel_progress_timelimit_sec > early_exit_time) {
+				if (oglobals->originate_status[i].per_channel_progress_timelimit_sec) {
+					if (oglobals->originate_status[i].per_channel_progress_timelimit_sec > early_exit_time) {
 						/* IN theory this check is not needed ( should just be if !0 then -= with no else), if its not 0 it should always be greater.... */
-						originate_status[i].per_channel_progress_timelimit_sec -= early_exit_time;
+						oglobals->originate_status[i].per_channel_progress_timelimit_sec -= early_exit_time;
 					} else {
-						originate_status[i].per_channel_progress_timelimit_sec = 1;
+						oglobals->originate_status[i].per_channel_progress_timelimit_sec = 1;
 					}
 				}
-				originate_status[i].per_channel_delay_start -= delayed_min;
+				oglobals->originate_status[i].per_channel_delay_start -= delayed_min;
 			} else {
-				originate_status[i].per_channel_delay_start = 0;
+				oglobals->originate_status[i].per_channel_delay_start = 0;
 			}
 
-			if (!originate_status[i].per_channel_delay_start) {
-				switch_channel_clear_flag(originate_status[i].peer_channel, CF_BLOCK_STATE);
+			if (!oglobals->originate_status[i].per_channel_delay_start) {
+				switch_channel_clear_flag(oglobals->originate_status[i].peer_channel, CF_BLOCK_STATE);
 			}
 		}
 
-		if (originate_status[i].peer_channel && switch_channel_up_nosig(originate_status[i].peer_channel)) {
-			if (originate_status[i].per_channel_progress_timelimit_sec && elapsed > originate_status[i].per_channel_progress_timelimit_sec &&
-				!(switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY) ||
-				  switch_channel_test_flag(originate_status[i].peer_channel, CF_ANSWERED) ||
-				  (!oglobals->monitor_early_media_ring && switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_MEDIA))
+		if (oglobals->originate_status[i].peer_channel && switch_channel_up_nosig(oglobals->originate_status[i].peer_channel)) {
+			if (oglobals->originate_status[i].per_channel_progress_timelimit_sec && elapsed > oglobals->originate_status[i].per_channel_progress_timelimit_sec &&
+				!(switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_RING_READY) ||
+				  switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_ANSWERED) ||
+				  (!oglobals->monitor_early_media_ring && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_MEDIA))
 				)
 				) {
-				switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_PROGRESS_TIMEOUT);
+				switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_PROGRESS_TIMEOUT);
 				*force_reason = SWITCH_CAUSE_PROGRESS_TIMEOUT;
 				x++;
 			}
-			if (originate_status[i].per_channel_timelimit_sec && elapsed > originate_status[i].per_channel_timelimit_sec) {
-				switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT);
+			if (oglobals->originate_status[i].per_channel_timelimit_sec && elapsed > oglobals->originate_status[i].per_channel_timelimit_sec) {
+				switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT);
 				x++;
 			}
 		}
@@ -359,6 +360,7 @@ static int check_per_channel_timeouts(originate_global_t *oglobals,
 	return x;
 }
 
+
 static switch_bool_t monitor_callback(switch_core_session_t *session, const char *app, const char *data)
 {
 	if (app) {
@@ -448,7 +450,7 @@ static void inherit_codec(switch_channel_t *caller_channel, switch_core_session_
 	}
 }
 
-static uint8_t check_channel_status(originate_global_t *oglobals, originate_status_t *originate_status, uint32_t len, switch_call_cause_t *force_reason)
+static uint8_t check_channel_status(originate_global_t *oglobals, uint32_t len, switch_call_cause_t *force_reason)
 {
 
 	uint32_t i;
@@ -473,29 +475,29 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 
 
 	for (i = 0; i < len; i++) {
-		if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_CHANNEL_SWAP)) {
-			const char *key = switch_channel_get_variable(originate_status[i].peer_channel, "channel_swap_uuid");
+		if (oglobals->originate_status[i].peer_channel && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_CHANNEL_SWAP)) {
+			const char *key = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "channel_swap_uuid");
 			switch_core_session_t *swap_session, *old_session;
-
+			
 			if ((swap_session = switch_core_session_locate(key))) {
-				switch_channel_clear_flag(originate_status[i].peer_channel, CF_CHANNEL_SWAP);
-				switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_PICKED_OFF);
+				switch_channel_clear_flag(oglobals->originate_status[i].peer_channel, CF_CHANNEL_SWAP);
+				switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_PICKED_OFF);
 
-				switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(originate_status[i].peer_channel), SWITCH_LOG_DEBUG, "Swapping %s for %s\n",
-								  switch_core_session_get_name(swap_session), switch_channel_get_name(originate_status[i].peer_channel));
+				switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(oglobals->originate_status[i].peer_channel), SWITCH_LOG_DEBUG, "Swapping %s for %s\n",
+								  switch_core_session_get_name(swap_session), switch_channel_get_name(oglobals->originate_status[i].peer_channel));
 
 
-				old_session = originate_status[i].peer_session;
-				originate_status[i].peer_session = swap_session;
-				originate_status[i].peer_channel = switch_core_session_get_channel(originate_status[i].peer_session);
-				originate_status[i].caller_profile = switch_channel_get_caller_profile(originate_status[i].peer_channel);
-				switch_channel_set_flag(originate_status[i].peer_channel, CF_ORIGINATING);
+				old_session = oglobals->originate_status[i].peer_session;
+				oglobals->originate_status[i].peer_session = swap_session;
+				oglobals->originate_status[i].peer_channel = switch_core_session_get_channel(oglobals->originate_status[i].peer_session);
+				oglobals->originate_status[i].caller_profile = switch_channel_get_caller_profile(oglobals->originate_status[i].peer_channel);
+				switch_channel_set_flag(oglobals->originate_status[i].peer_channel, CF_ORIGINATING);
 
-				switch_channel_answer(originate_status[i].peer_channel);
+				switch_channel_answer(oglobals->originate_status[i].peer_channel);
 
-				switch_channel_set_variable(originate_status[i].peer_channel, "picked_up_uuid", switch_core_session_get_uuid(old_session));
-				switch_channel_execute_on(originate_status[i].peer_channel, "execute_on_pickup");
-				switch_channel_api_on(originate_status[i].peer_channel, "api_on_pickup");
+				switch_channel_set_variable(oglobals->originate_status[i].peer_channel, "picked_up_uuid", switch_core_session_get_uuid(old_session));
+				switch_channel_execute_on(oglobals->originate_status[i].peer_channel, "execute_on_pickup");
+				switch_channel_api_on(oglobals->originate_status[i].peer_channel, "api_on_pickup");
 
 				switch_core_session_rwunlock(old_session);
 				break;
@@ -506,15 +508,15 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 	for (i = 0; i < len; i++) {
 		switch_channel_state_t state;
 
-		if (originate_status[i].tagged && originate_status[i].peer_session) {
-			switch_channel_t *channel = switch_core_session_get_channel(originate_status[i].peer_session);
+		if (oglobals->originate_status[i].tagged && oglobals->originate_status[i].peer_session) {
+			switch_channel_t *channel = switch_core_session_get_channel(oglobals->originate_status[i].peer_session);
 			uint32_t j;
 
 			if (switch_channel_down_nosig(channel)) {
 				switch_call_cause_t cause = switch_channel_get_cause(channel);
 
 				for (j = 0; j < len; j++) {
-					channel = switch_core_session_get_channel(originate_status[j].peer_session);
+					channel = switch_core_session_get_channel(oglobals->originate_status[j].peer_session);
 					switch_channel_hangup(channel, cause);
 				}
 				oglobals->hups = len;
@@ -524,20 +526,20 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 		}
 
 
-		if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP)) {
-			if (originate_status[i].per_channel_timelimit_sec == 0) {
+		if (oglobals->originate_status[i].peer_channel && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PICKUP)) {
+			if (oglobals->originate_status[i].per_channel_timelimit_sec == 0) {
 				pickups_without_timelimit++;
 			}
 		}
 
-		if (!(originate_status[i].peer_channel && originate_status[i].peer_session)) {
+		if (!(oglobals->originate_status[i].peer_channel && oglobals->originate_status[i].peer_session)) {
 			oglobals->hups++;
 			continue;
 		}
 
-		if ((ring_ready_val = (uint8_t)switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY))) {
-			if (!originate_status[i].ring_ready) {
-				originate_status[i].ring_ready = ring_ready_val;
+		if ((ring_ready_val = (uint8_t)switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_RING_READY))) {
+			if (!oglobals->originate_status[i].ring_ready) {
+				oglobals->originate_status[i].ring_ready = ring_ready_val;
 			}
 
 			if (oglobals->sending_ringback == 1) {
@@ -548,7 +550,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 					oglobals->ring_ready = ring_ready_val;
 					if (caller_channel && !oglobals->ignore_ring_ready) {
 						if (len == 1) {
-							switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel);
+							switch_channel_pass_callee_id(oglobals->originate_status[0].peer_channel, caller_channel);
 						}
 						switch_channel_ring_ready_value(caller_channel, ring_ready_val);
 						oglobals->sent_ring = ring_ready_val;
@@ -557,7 +559,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 			}
 		}
 
-		if (switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_MEDIA)) {
+		if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_MEDIA)) {
 
 			if (oglobals->ignore_early_media == 3 && oglobals->bridge_early_media == -1) {
 				oglobals->bridge_early_media = i;
@@ -568,19 +570,19 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 				send_ringback++;
 				pindex = (uint32_t) i;
 			} else if (!oglobals->sent_ring && oglobals->ignore_early_media == 2 && len == 1 && caller_channel && !oglobals->ignore_ring_ready) {
-				switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel);
+				switch_channel_pass_callee_id(oglobals->originate_status[0].peer_channel, caller_channel);
 				switch_channel_ring_ready(caller_channel);
 				oglobals->sent_ring = 1;
 			}
 
-			if (!originate_status[i].early_media) {
-				originate_status[i].early_media = 1;
+			if (!oglobals->originate_status[i].early_media) {
+				oglobals->originate_status[i].early_media = 1;
 				if (oglobals->early_ok) {
 					pindex = i;
 				}
 
 				if (oglobals->monitor_early_media_fail) {
-					const char *var = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_fail");
+					const char *var = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "monitor_early_media_fail");
 					if (!zstr(var)) {
 						char *fail_array[128] = { 0 };
 						int fail_count = 0;
@@ -597,14 +599,14 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 							char *p, *q;
 
 							if (!(p = strchr(cause, ':'))) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 							*p++ = '\0';
 
 
 							if (!p) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 
@@ -615,13 +617,13 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 
 
 							if (!(p = strchr(p, ':'))) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 							*p++ = '\0';
 
 							if (!p) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 
@@ -631,7 +633,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 								}
 							}
 							switch_snprintf(bug_key, sizeof(bug_key), "monitor_early_media_fail_%d", ++y);
-							switch_ivr_tone_detect_session(originate_status[i].peer_session, bug_key, p, "r", 0, hits, "fail", cause, monitor_callback);
+							switch_ivr_tone_detect_session(oglobals->originate_status[i].peer_session, bug_key, p, "r", 0, hits, "fail", cause, monitor_callback);
 
 						}
 
@@ -641,8 +643,8 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 				}
 
 				if (oglobals->monitor_early_media_ring) {
-					const char *var = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_ring");
-					const char *var_total = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_ring_total");
+					const char *var = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "monitor_early_media_ring");
+					const char *var_total = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "monitor_early_media_ring_total");
 					if (!zstr(var)) {
 						char *ring_array[128] = { 0 };
 						int ring_count = 0;
@@ -658,7 +660,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 							char *p = ring_array[fx], *q;
 
 							if (!p) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 
@@ -667,13 +669,13 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 							}
 
 							if (!(p = strchr(p, ':'))) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 							*p++ = '\0';
 
 							if (!p) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n");
 								continue;
 							}
 
@@ -683,17 +685,17 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 								}
 							}
 
-							switch_channel_set_private(originate_status[i].peer_channel, "_oglobals_", oglobals);
+							switch_channel_set_private(oglobals->originate_status[i].peer_channel, "_oglobals_", oglobals);
 							switch_snprintf(bug_key, sizeof(bug_key), "monitor_early_media_ring_%d", ++y);
-							switch_ivr_tone_detect_session(originate_status[i].peer_session, bug_key, p, "r", 0, hits, "ring", NULL, monitor_callback);
+							switch_ivr_tone_detect_session(oglobals->originate_status[i].peer_session, bug_key, p, "r", 0, hits, "ring", NULL, monitor_callback);
 
 						}
 
 						if (var_total) {
 							int tmp = atoi(var_total);
 							if (tmp > 0 && tmp < 100) {
-								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_DEBUG,
-												  "%s setting ring total to %d\n", switch_channel_get_name(originate_status[i].peer_channel), tmp);
+								switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_DEBUG,
+												  "%s setting ring total to %d\n", switch_channel_get_name(oglobals->originate_status[i].peer_channel), tmp);
 								oglobals->monitor_early_media_ring_total = tmp;
 							}
 						}
@@ -717,22 +719,22 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 			}
 		}
 
-		if (!switch_channel_test_flag(originate_status[i].peer_channel, CF_PARK) &&
-			!switch_channel_test_flag(originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE)) {
-			if (switch_core_session_messages_waiting(originate_status[i].peer_session)) {
-				if (switch_channel_test_flag(originate_status[i].peer_channel, CF_THREAD_SLEEPING)) {
-					switch_core_session_wake_session_thread(originate_status[i].peer_session);
+		if (!switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PARK) &&
+			!switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE)) {
+			if (switch_core_session_messages_waiting(oglobals->originate_status[i].peer_session)) {
+				if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_THREAD_SLEEPING)) {
+					switch_core_session_wake_session_thread(oglobals->originate_status[i].peer_session);
 				} else {
-					switch_ivr_parse_all_events(originate_status[i].peer_session);
+					switch_ivr_parse_all_events(oglobals->originate_status[i].peer_session);
 				}
 			}
 		}
 
-		if (switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_OK)) {
+		if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_OK)) {
 			if (!oglobals->early_ok) {
 				oglobals->early_ok = 1;
 			}
-			switch_channel_clear_flag(originate_status[i].peer_channel, CF_EARLY_OK);
+			switch_channel_clear_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_OK);
 		}
 
 		if (caller_channel && switch_channel_test_flag(caller_channel, CF_EARLY_OK)) {
@@ -742,24 +744,24 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 			switch_channel_clear_flag(caller_channel, CF_EARLY_OK);
 		}
 
-		state = switch_channel_get_state(originate_status[i].peer_channel);
-		if (state >= CS_HANGUP || state == CS_RESET || switch_channel_test_flag(originate_status[i].peer_channel, CF_TRANSFER) ||
-			switch_channel_test_flag(originate_status[i].peer_channel, CF_REDIRECT) ||
-			switch_channel_test_flag(originate_status[i].peer_channel, CF_BRIDGED) ||
-			!switch_channel_test_flag(originate_status[i].peer_channel, CF_ORIGINATING)
+		state = switch_channel_get_state(oglobals->originate_status[i].peer_channel);
+		if (state >= CS_HANGUP || state == CS_RESET || switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_TRANSFER) ||
+			switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_REDIRECT) ||
+			switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_BRIDGED) ||
+			!switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_ORIGINATING)
 			) {
 			(oglobals->hups)++;
-			if (switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP)) {
-				if (originate_status[i].per_channel_timelimit_sec == 0) {
+			if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PICKUP)) {
+				if (oglobals->originate_status[i].per_channel_timelimit_sec == 0) {
 					pickups_without_timelimit--;
 				}
 			}
-		} else if ((switch_channel_test_flag(originate_status[i].peer_channel, CF_ANSWERED) ||
-					(oglobals->early_ok && switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_MEDIA)) ||
+		} else if ((switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_ANSWERED) ||
+					(oglobals->early_ok && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_MEDIA)) ||
 					(oglobals->ring_ready && oglobals->return_ring_ready && len == 1 &&
-					 switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY))
+					 switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_RING_READY))
 				   )
-				   && !switch_channel_test_flag(originate_status[i].peer_channel, CF_TAGGED)
+				   && !switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_TAGGED)
 			) {
 
 			if (!zstr(oglobals->key)) {
@@ -767,20 +769,20 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 
 				if (oglobals->cancel_timeout == SWITCH_TRUE) {
 					/* cancel timeout for this leg only */
-					originate_status[i].per_channel_progress_timelimit_sec = 0;
-					originate_status[i].per_channel_timelimit_sec = 0;
+					oglobals->originate_status[i].per_channel_progress_timelimit_sec = 0;
+					oglobals->originate_status[i].per_channel_timelimit_sec = 0;
 				}
 
-				if ((collect = switch_core_session_alloc(originate_status[i].peer_session, sizeof(*collect)))) {
-					switch_channel_set_flag(originate_status[i].peer_channel, CF_TAGGED);
+				if ((collect = switch_core_session_alloc(oglobals->originate_status[i].peer_session, sizeof(*collect)))) {
+					switch_channel_set_flag(oglobals->originate_status[i].peer_channel, CF_TAGGED);
 					if (!zstr(oglobals->key)) {
-						collect->key = switch_core_session_strdup(originate_status[i].peer_session, oglobals->key);
+						collect->key = switch_core_session_strdup(oglobals->originate_status[i].peer_session, oglobals->key);
 					}
 					if (!zstr(oglobals->file)) {
-						collect->file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->file);
+						collect->file = switch_core_session_strdup(oglobals->originate_status[i].peer_session, oglobals->file);
 					}
 					if (!zstr(oglobals->error_file)) {
-						collect->error_file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->error_file);
+						collect->error_file = switch_core_session_strdup(oglobals->originate_status[i].peer_session, oglobals->error_file);
 					}
 
 					if (oglobals->confirm_timeout) {
@@ -789,8 +791,8 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 						collect->confirm_timeout = 5000;
 					}
 
-					switch_channel_audio_sync(originate_status[i].peer_channel);
-					collect->session = originate_status[i].peer_session;
+					switch_channel_audio_sync(oglobals->originate_status[i].peer_channel);
+					collect->session = oglobals->originate_status[i].peer_session;
 					launch_collect_thread(collect);
 				}
 			} else {
@@ -800,7 +802,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 				goto end;
 
 			}
-		} else if (switch_channel_test_flag(originate_status[i].peer_channel, CF_WINNER)) {
+		} else if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_WINNER)) {
 			oglobals->idx = i;
 			rval = 0;
 			pindex = (uint32_t) i;
@@ -819,17 +821,17 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
 
 	if (rval == 0 && pickups_without_timelimit) {
 		for (i = 0; i < len; i++) {
-			if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP) &&
-				switch_channel_up(originate_status[i].peer_channel)) {
-				switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_NO_PICKUP);
+			if (oglobals->originate_status[i].peer_channel && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PICKUP) &&
+				switch_channel_up(oglobals->originate_status[i].peer_channel)) {
+				switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_NO_PICKUP);
 			}
 		}
 	}
 
 
 	if (pindex > -1 && caller_channel && switch_channel_ready(caller_channel) && !switch_channel_media_ready(caller_channel) &&
-		switch_channel_media_ready(originate_status[pindex].peer_channel)) {
-		inherit_codec(caller_channel, originate_status[pindex].peer_session);
+		switch_channel_media_ready(oglobals->originate_status[pindex].peer_channel)) {
+		inherit_codec(caller_channel, oglobals->originate_status[pindex].peer_session);
 	}
 
 	if (send_ringback) {
@@ -1791,7 +1793,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_enterprise_originate(switch_core_sess
 
 struct early_state {
 	originate_global_t *oglobals;
-	originate_status_t *originate_status;
 	switch_mutex_t *mutex;
 	switch_buffer_t *buffer;
 	int ready;
@@ -1804,7 +1805,7 @@ typedef struct early_state early_state_t;
 static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void *obj)
 {
 	early_state_t *state = (early_state_t *) obj;
-	originate_status_t originate_status[MAX_PEERS] = { {0} };
+	//originate_status_t originate_status[MAX_PEERS] = { {0} };
 	int16_t mux_data[SWITCH_RECOMMENDED_BUFFER_SIZE / 2] = { 0 };
 	int32_t sample;
 	switch_codec_t read_codecs[MAX_PEERS] = { {0} };
@@ -1815,6 +1816,7 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void *
 	switch_frame_t *read_frame = NULL;
 	switch_codec_implementation_t read_impl = { 0 };
 
+#if 0
 	for (i = 0; i < MAX_PEERS && i < state->ttl; i++) {
 		switch_core_session_t *session = state->originate_status[i].peer_session;
 		switch_channel_t *channel = NULL;
@@ -1830,7 +1832,8 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void *
 			originate_status[i].peer_channel = channel;
 		}
 	}
-
+#endif
+	
 	if (state->oglobals->session) {
 		switch_core_session_get_read_impl(state->oglobals->session, &read_impl);
 	}
@@ -1842,8 +1845,8 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void *
 		answered = 0;
 
 		for (i = 0; i < MAX_PEERS && i < state->ttl; i++) {
-			switch_core_session_t *session = originate_status[i].peer_session;
-			switch_channel_t *channel = originate_status[i].peer_channel;
+			switch_core_session_t *session = state->oglobals->originate_status[i].peer_session;
+			switch_channel_t *channel = state->oglobals->originate_status[i].peer_channel;
 
 			if (!session || !channel || !switch_channel_up(channel)) {
 				continue;
@@ -1922,8 +1925,8 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void *
 
 
 	for (i = 0; i < MAX_PEERS && i < state->ttl; i++) {
-		switch_core_session_t *session = originate_status[i].peer_session;
-		switch_channel_t *channel = originate_status[i].peer_channel;
+		switch_core_session_t *session = state->oglobals->originate_status[i].peer_session;
+		switch_channel_t *channel = state->oglobals->originate_status[i].peer_channel;
 
 		if (!session) continue;
 
@@ -1976,7 +1979,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 													 switch_call_cause_t *cancel_cause,
 													 switch_dial_handle_t *dh)
 {
-	originate_status_t originate_status[MAX_PEERS] = { {0} };
+	//originate_status_t originate_status[MAX_PEERS] = { {0} };
 	switch_originate_flag_t dftflags = SOF_NONE, myflags;
 	char *pipe_names[MAX_PEERS] = { 0 };
 	char *data = NULL;
@@ -2654,7 +2657,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 			reason = SWITCH_CAUSE_NONE;
 			memset(peer_names, 0, sizeof(peer_names));
 			peer_session = NULL;
-			memset(originate_status, 0, sizeof(originate_status));
+			memset(oglobals.originate_status, 0, sizeof(oglobals.originate_status));
 			new_profile = NULL;
 			new_session = NULL;
 			chan_type = NULL;
@@ -2867,9 +2870,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 				new_profile->callee_id_name = switch_core_strdup(new_profile->pool, "Outbound Call");
 				new_profile->callee_id_number = switch_sanitize_number(switch_core_strdup(new_profile->pool, new_profile->destination_number));
 
-				originate_status[i].caller_profile = NULL;
-				originate_status[i].peer_channel = NULL;
-				originate_status[i].peer_session = NULL;
+				oglobals.originate_status[i].caller_profile = NULL;
+				oglobals.originate_status[i].peer_channel = NULL;
+				oglobals.originate_status[i].peer_session = NULL;
 
 				new_session = NULL;
 
@@ -2982,27 +2985,27 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					goto done;
 				}
 
-				originate_status[i].peer_channel = switch_core_session_get_channel(new_session);
-				originate_status[i].caller_profile = switch_channel_get_caller_profile(originate_status[i].peer_channel);
-				originate_status[i].peer_session = new_session;
+				oglobals.originate_status[i].peer_channel = switch_core_session_get_channel(new_session);
+				oglobals.originate_status[i].caller_profile = switch_channel_get_caller_profile(oglobals.originate_status[i].peer_channel);
+				oglobals.originate_status[i].peer_session = new_session;
 
-				switch_channel_set_flag(originate_status[i].peer_channel, CF_ORIGINATING);
+				switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING);
 
 				if (caller_channel) {
-					switch_channel_set_variable(originate_status[i].peer_channel, "call_uuid", switch_channel_get_variable(caller_channel, "call_uuid"));
+					switch_channel_set_variable(oglobals.originate_status[i].peer_channel, "call_uuid", switch_channel_get_variable(caller_channel, "call_uuid"));
 				}
 
 
 				if (local_var_event) {
 					const char *device_id = switch_event_get_header(local_var_event, "device_id");
-					switch_channel_set_profile_var(originate_status[i].peer_channel, "device_id", device_id);
+					switch_channel_set_profile_var(oglobals.originate_status[i].peer_channel, "device_id", device_id);
 				}
 
 				if ((lc = switch_event_get_header(var_event, "local_var_clobber"))) {
 					local_clobber = switch_true(lc);
 				}
 
-				if (switch_channel_test_flag(originate_status[i].peer_channel, CF_NO_PRESENCE)) {
+				if (switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_NO_PRESENCE)) {
 					if (var_event) {
 						switch_event_del_header(var_event, "presence_id");
 					}
@@ -3017,7 +3020,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						switch_event_header_t *header;
 						/* install the vars from the {} params */
 						for (header = var_event->headers; header; header = header->next) {
-							switch_channel_set_variable_var_check(originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars);
+							switch_channel_set_variable_var_check(oglobals.originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars);
 						}
 					}
 				}
@@ -3026,7 +3029,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 				if (local_var_event) {
 					switch_event_header_t *header;
 					for (header = local_var_event->headers; header; header = header->next) {
-						switch_channel_set_variable_var_check(originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars);
+						switch_channel_set_variable_var_check(oglobals.originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars);
 					}
 					switch_event_destroy(&local_var_event);
 				}
@@ -3036,62 +3039,62 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						switch_event_header_t *header;
 						/* install the vars from the {} params */
 						for (header = var_event->headers; header; header = header->next) {
-							switch_channel_set_variable_var_check(originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars);
+							switch_channel_set_variable_var_check(oglobals.originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars);
 						}
 					}
 				}
 
-				if (originate_status[i].peer_channel) {
+				if (oglobals.originate_status[i].peer_channel) {
 					const char *vvar;
 
-					if (switch_true(switch_channel_get_variable(originate_status[i].peer_channel, "leg_required"))) {
-						originate_status[i].tagged = 1;
+					if (switch_true(switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_required"))) {
+						oglobals.originate_status[i].tagged = 1;
 					}
 
-					if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "origination_channel_name"))) {
-						switch_channel_set_name(originate_status[i].peer_channel, vvar);
+					if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "origination_channel_name"))) {
+						switch_channel_set_name(oglobals.originate_status[i].peer_channel, vvar);
 					}
 
-					if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "origination_callee_id_name"))) {
-						switch_channel_set_profile_var(originate_status[i].peer_channel, "callee_id_name", vvar);
+					if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "origination_callee_id_name"))) {
+						switch_channel_set_profile_var(oglobals.originate_status[i].peer_channel, "callee_id_name", vvar);
 					}
 
-					if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "origination_callee_id_number"))) {
-						switch_channel_set_profile_var(originate_status[i].peer_channel, "callee_id_number", vvar);
+					if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "origination_callee_id_number"))) {
+						switch_channel_set_profile_var(oglobals.originate_status[i].peer_channel, "callee_id_number", vvar);
 					}
 
-					if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_timeout"))) {
+					if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_timeout"))) {
 						int val = atoi(vvar);
 
 						if (val > 0) {
 							switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Setting leg timeout to %d\n",
-											  switch_channel_get_name(originate_status[i].peer_channel), val);
-							originate_status[i].per_channel_timelimit_sec = (uint32_t) val;
+											  switch_channel_get_name(oglobals.originate_status[i].peer_channel), val);
+							oglobals.originate_status[i].per_channel_timelimit_sec = (uint32_t) val;
 						}
 					}
 
-					if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_progress_timeout"))) {
+					if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_progress_timeout"))) {
 						int val = atoi(vvar);
 						if (val > 0) {
 							switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Setting leg progress timeout to %d\n",
-											  switch_channel_get_name(originate_status[i].peer_channel), val);
-							originate_status[i].per_channel_progress_timelimit_sec = (uint32_t) val;
+											  switch_channel_get_name(oglobals.originate_status[i].peer_channel), val);
+							oglobals.originate_status[i].per_channel_progress_timelimit_sec = (uint32_t) val;
 						}
 					}
 
-					if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_delay_start"))) {
+					if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_delay_start"))) {
 						int val = atoi(vvar);
 						if (val > 0) {
 							switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Setting leg delay start to %d\n",
-											  switch_channel_get_name(originate_status[i].peer_channel), val);
-							originate_status[i].per_channel_delay_start = (uint32_t) val;
+											  switch_channel_get_name(oglobals.originate_status[i].peer_channel), val);
+							oglobals.originate_status[i].per_channel_delay_start = (uint32_t) val;
 
-							if (originate_status[i].per_channel_progress_timelimit_sec != 0) {
-								originate_status[i].per_channel_progress_timelimit_sec += originate_status[i].per_channel_delay_start;
+							if (oglobals.originate_status[i].per_channel_progress_timelimit_sec != 0) {
+								oglobals.originate_status[i].per_channel_progress_timelimit_sec += oglobals.originate_status[i].per_channel_delay_start;
 							}
 
-							if (originate_status[i].per_channel_timelimit_sec != 0) {
-								originate_status[i].per_channel_timelimit_sec += originate_status[i].per_channel_delay_start;
+							if (oglobals.originate_status[i].per_channel_timelimit_sec != 0) {
+								oglobals.originate_status[i].per_channel_timelimit_sec += oglobals.originate_status[i].per_channel_delay_start;
 							}
 						}
 					}
@@ -3105,12 +3108,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						switch_channel_t *channel = switch_core_session_get_channel(a_session);
 						char *val =
 							switch_core_session_sprintf(a_session, "%s;%s;%s",
-														switch_core_session_get_uuid(originate_status[i].peer_session),
-														switch_str_nil(switch_channel_get_variable(originate_status[i].peer_channel, "callee_id_name")),
-														switch_str_nil(switch_channel_get_variable(originate_status[i].peer_channel, "callee_id_number")));
+														switch_core_session_get_uuid(oglobals.originate_status[i].peer_session),
+														switch_str_nil(switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "callee_id_name")),
+														switch_str_nil(switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "callee_id_number")));
 
 
-						switch_channel_set_variable(originate_status[i].peer_channel, "originating_leg_uuid", switch_core_session_get_uuid(a_session));
+						switch_channel_set_variable(oglobals.originate_status[i].peer_channel, "originating_leg_uuid", switch_core_session_get_uuid(a_session));
 
 						switch_channel_add_variable_var_check(channel, "originated_legs", val, SWITCH_FALSE, SWITCH_STACK_PUSH);
 
@@ -3121,32 +3124,32 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						l_session = NULL;
 					}
 
-					switch_channel_execute_on(originate_status[i].peer_channel, SWITCH_CHANNEL_EXECUTE_ON_ORIGINATE_VARIABLE);
-					switch_channel_api_on(originate_status[i].peer_channel, SWITCH_CHANNEL_API_ON_ORIGINATE_VARIABLE);
+					switch_channel_execute_on(oglobals.originate_status[i].peer_channel, SWITCH_CHANNEL_EXECUTE_ON_ORIGINATE_VARIABLE);
+					switch_channel_api_on(oglobals.originate_status[i].peer_channel, SWITCH_CHANNEL_API_ON_ORIGINATE_VARIABLE);
 				}
 
 				if (table) {
-					switch_channel_add_state_handler(originate_status[i].peer_channel, table);
+					switch_channel_add_state_handler(oglobals.originate_status[i].peer_channel, table);
 				}
 
 				if (oglobals.monitor_early_media_ring || oglobals.monitor_early_media_fail || oglobals.ignore_early_media == 4) {
-					switch_channel_set_flag(originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE);
+					switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE);
 				}
 
-				switch_channel_add_state_handler(originate_status[i].peer_channel, &originate_state_handlers);
+				switch_channel_add_state_handler(oglobals.originate_status[i].peer_channel, &originate_state_handlers);
 
-				if ((flags & SOF_NOBLOCK) && originate_status[i].peer_session) {
+				if ((flags & SOF_NOBLOCK) && oglobals.originate_status[i].peer_session) {
 					status = SWITCH_STATUS_SUCCESS;
-					*bleg = originate_status[i].peer_session;
+					*bleg = oglobals.originate_status[i].peer_session;
 					*cause = SWITCH_CAUSE_SUCCESS;
 					goto outer_for;
 				}
 
-				if (!switch_core_session_running(originate_status[i].peer_session)) {
-					if (originate_status[i].per_channel_delay_start) {
-						switch_channel_set_flag(originate_status[i].peer_channel, CF_BLOCK_STATE);
+				if (!switch_core_session_running(oglobals.originate_status[i].peer_session)) {
+					if (oglobals.originate_status[i].per_channel_delay_start) {
+						switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_BLOCK_STATE);
 					}
-					switch_core_session_thread_launch(originate_status[i].peer_session);
+					switch_core_session_thread_launch(oglobals.originate_status[i].peer_session);
 				}
 			}
 
@@ -3158,11 +3161,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					int state;
 					time_t elapsed;
 
-					if (!originate_status[i].peer_channel) {
+					if (!oglobals.originate_status[i].peer_channel) {
 						continue;
 					}
 
-					state = switch_channel_get_state(originate_status[i].peer_channel);
+					state = switch_channel_get_state(oglobals.originate_status[i].peer_channel);
 
 					if (state < CS_HANGUP) {
 						valid_channels++;
@@ -3199,7 +3202,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					switch_cond_next();
 				}
 
-				check_per_channel_timeouts(&oglobals, originate_status, and_argc, start, &force_reason);
+				check_per_channel_timeouts(&oglobals, and_argc, start, &force_reason);
 
 
 				if (valid_channels == 0) {
@@ -3237,7 +3240,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 			}
 
 			while ((!caller_channel || switch_channel_ready(caller_channel) || switch_channel_test_flag(caller_channel, CF_XFER_ZOMBIE)) &&
-				   check_channel_status(&oglobals, originate_status, and_argc, &force_reason)) {
+				   check_channel_status(&oglobals, and_argc, &force_reason)) {
 				time_t elapsed = switch_epoch_time_now(NULL) - start;
 
 				read_packet = 0;
@@ -3250,7 +3253,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					goto notready;
 				}
 
-				check_per_channel_timeouts(&oglobals, originate_status, and_argc, start, &force_reason);
+				check_per_channel_timeouts(&oglobals, and_argc, start, &force_reason);
 
 				if (oglobals.session) {
 					switch_ivr_parse_all_events(oglobals.session);
@@ -3275,10 +3278,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 								switch_channel_t *pchannel;
 								const char *cause_str;
 
-								if (!originate_status[i].peer_session) {
+								if (!oglobals.originate_status[i].peer_session) {
 									continue;
 								}
-								pchannel = switch_core_session_get_channel(originate_status[i].peer_session);
+								pchannel = switch_core_session_get_channel(oglobals.originate_status[i].peer_session);
 
 								if (switch_channel_down_nosig(pchannel)) {
 									int neg, pos;
@@ -3352,14 +3355,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						if (oglobals.ringback_ok == 1) {
 							switch_status_t rst;
 
-							rst = setup_ringback(&oglobals, originate_status, and_argc, ringback_data, &ringback, &write_frame, &write_codec);
+							rst = setup_ringback(&oglobals, oglobals.originate_status, and_argc, ringback_data, &ringback, &write_frame, &write_codec);
 
 							if (oglobals.bridge_early_media > -1) {
 								switch_threadattr_t *thd_attr = NULL;
 								switch_threadattr_create(&thd_attr, switch_core_session_get_pool(session));
 								switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
 								early_state.oglobals = &oglobals;
-								early_state.originate_status = originate_status;
+								//early_state.originate_status = oglobals.originate_status;
 								early_state.ready = 1;
 								early_state.ringback = &ringback;
 								early_state.ttl = and_argc;
@@ -3510,33 +3513,33 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 
 			if (holding) {
 				if (oglobals.idx > IDX_NADA) {
-					peer_session = originate_status[oglobals.idx].peer_session;
-					peer_channel = originate_status[oglobals.idx].peer_channel;
-					originate_status[oglobals.idx].peer_channel = NULL;
+					peer_session = oglobals.originate_status[oglobals.idx].peer_session;
+					peer_channel = oglobals.originate_status[oglobals.idx].peer_channel;
+					oglobals.originate_status[oglobals.idx].peer_channel = NULL;
 				} else if (and_argc == 1) {
-					peer_session = originate_status[0].peer_session;
-					peer_channel = originate_status[0].peer_channel;
-					originate_status[0].peer_channel = NULL;
+					peer_session = oglobals.originate_status[0].peer_session;
+					peer_channel = oglobals.originate_status[0].peer_channel;
+					oglobals.originate_status[0].peer_channel = NULL;
 				} else {
 					for (i = 0; i < and_argc; i++) {
-						if (!peer_eligible(originate_status[i].peer_channel)) {
+						if (!peer_eligible(oglobals.originate_status[i].peer_channel)) {
 							continue;
 						}
-						if (switch_channel_media_ready(originate_status[i].peer_channel)) {
-							peer_session = originate_status[i].peer_session;
-							peer_channel = originate_status[i].peer_channel;
-							originate_status[i].peer_channel = NULL;
+						if (switch_channel_media_ready(oglobals.originate_status[i].peer_channel)) {
+							peer_session = oglobals.originate_status[i].peer_session;
+							peer_channel = oglobals.originate_status[i].peer_channel;
+							oglobals.originate_status[i].peer_channel = NULL;
 							goto end_search;
 						}
 					}
 					for (i = 0; i < and_argc; i++) {
-						if (!peer_eligible(originate_status[i].peer_channel)) {
+						if (!peer_eligible(oglobals.originate_status[i].peer_channel)) {
 							continue;
 						}
-						if (switch_channel_up_nosig(originate_status[i].peer_channel)) {
-							peer_session = originate_status[i].peer_session;
-							peer_channel = originate_status[i].peer_channel;
-							originate_status[i].peer_channel = NULL;
+						if (switch_channel_up_nosig(oglobals.originate_status[i].peer_channel)) {
+							peer_session = oglobals.originate_status[i].peer_session;
+							peer_channel = oglobals.originate_status[i].peer_channel;
+							oglobals.originate_status[i].peer_channel = NULL;
 							break;
 						}
 					}
@@ -3657,7 +3660,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 			}
 
 			for (i = 0; i < and_argc; i++) {
-				if (!peer_eligible(originate_status[i].peer_channel)) {
+				if (!peer_eligible(oglobals.originate_status[i].peer_channel)) {
 					continue;
 				}
 
@@ -3672,17 +3675,17 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						} else {
 							if (and_argc > 1) {
 								reason = SWITCH_CAUSE_LOSE_RACE;
-							} else if (!switch_channel_ready(originate_status[i].peer_channel)) {
-								wait_for_cause(originate_status[i].peer_channel);
-								if (switch_channel_down_nosig(originate_status[i].peer_channel)) {
-									reason = switch_channel_get_cause(originate_status[i].peer_channel);
+							} else if (!switch_channel_ready(oglobals.originate_status[i].peer_channel)) {
+								wait_for_cause(oglobals.originate_status[i].peer_channel);
+								if (switch_channel_down_nosig(oglobals.originate_status[i].peer_channel)) {
+									reason = switch_channel_get_cause(oglobals.originate_status[i].peer_channel);
 								}
 							} else {
 								reason = SWITCH_CAUSE_NO_ANSWER;
 							}
 						}
 					}
-					if (switch_channel_up_nosig(originate_status[i].peer_channel)) {
+					if (switch_channel_up_nosig(oglobals.originate_status[i].peer_channel)) {
 						if (caller_channel && i == 0) {
 							holding = switch_channel_get_variable(caller_channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE);
 							switch_channel_set_variable(caller_channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE, NULL);
@@ -3697,23 +3700,23 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 								switch_channel_set_variable(holding_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE, "true");
 
 								if (caller_channel && switch_true(switch_channel_get_variable(caller_channel, "recording_follow_transfer"))) {
-									switch_ivr_transfer_recordings(session, originate_status[i].peer_session);
+									switch_ivr_transfer_recordings(session, oglobals.originate_status[i].peer_session);
 								}
 
 								if (switch_true(switch_channel_get_variable(holding_channel, "recording_follow_transfer"))) {
-									switch_ivr_transfer_recordings(holding_session, originate_status[i].peer_session);
+									switch_ivr_transfer_recordings(holding_session, oglobals.originate_status[i].peer_session);
 								}
 
 								switch_core_session_rwunlock(holding_session);
 							}
-							switch_channel_set_flag(originate_status[i].peer_channel, CF_LAZY_ATTENDED_TRANSFER);
-							switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(originate_status[i].peer_session));
+							switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_LAZY_ATTENDED_TRANSFER);
+							switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(oglobals.originate_status[i].peer_session));
 							holding = NULL;
 						} else {
 							if (force_reason == SWITCH_CAUSE_LOSE_RACE || reason == SWITCH_CAUSE_LOSE_RACE) {
-								switch_channel_set_variable(originate_status[i].peer_channel, "group_dial_status", "loser");
+								switch_channel_set_variable(oglobals.originate_status[i].peer_channel, "group_dial_status", "loser");
 							}
-							switch_channel_hangup(originate_status[i].peer_channel, force_reason ? force_reason : reason);
+							switch_channel_hangup(oglobals.originate_status[i].peer_channel, force_reason ? force_reason : reason);
 						}
 					}
 				}
@@ -3722,8 +3725,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 
 
 			if (oglobals.idx > IDX_NADA) {
-				if ((peer_session = originate_status[oglobals.idx].peer_session)) {
-					peer_channel = switch_core_session_get_channel(originate_status[oglobals.idx].peer_session);
+				if ((peer_session = oglobals.originate_status[oglobals.idx].peer_session)) {
+					peer_channel = switch_core_session_get_channel(oglobals.originate_status[oglobals.idx].peer_session);
 				}
 			} else {
 				status = SWITCH_STATUS_FALSE;
@@ -3834,10 +3837,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					*cause = switch_channel_get_cause(peer_channel);
 				} else {
 					for (i = 0; i < and_argc; i++) {
-						if (!originate_status[i].peer_channel) {
+						if (!oglobals.originate_status[i].peer_channel) {
 							continue;
 						}
-						*cause = switch_channel_get_cause(originate_status[i].peer_channel);
+						*cause = switch_channel_get_cause(oglobals.originate_status[i].peer_channel);
 						break;
 					}
 				}
@@ -3846,11 +3849,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					for (i = 0; i < and_argc; i++) {
 						switch_channel_t *channel;
 
-						if (!originate_status[i].peer_session) {
+						if (!oglobals.originate_status[i].peer_session) {
 							continue;
 						}
 
-						channel = switch_core_session_get_channel(originate_status[i].peer_session);
+						channel = switch_core_session_get_channel(oglobals.originate_status[i].peer_session);
 
 						switch_channel_wait_for_state_timeout(channel, CS_REPORTING, 5000);
 
@@ -3858,7 +3861,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 							switch_channel_set_timestamps(channel);
 						}
 
-						if (switch_ivr_generate_xml_cdr(originate_status[i].peer_session, &cdr) == SWITCH_STATUS_SUCCESS) {
+						if (switch_ivr_generate_xml_cdr(oglobals.originate_status[i].peer_session, &cdr) == SWITCH_STATUS_SUCCESS) {
 							if ((xml_text = switch_xml_toxml(cdr, SWITCH_FALSE))) {
 								switch_snprintf(buf, sizeof(buf), "%s_%d", cdr_var, ++cdr_total);
 								switch_channel_set_variable(caller_channel, buf, xml_text);
@@ -3878,11 +3881,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					for (i = 0; i < and_argc; i++) {
 						switch_channel_t *channel;
 
-						if (!originate_status[i].peer_session) {
+						if (!oglobals.originate_status[i].peer_session) {
 							continue;
 						}
 
-						channel = switch_core_session_get_channel(originate_status[i].peer_session);
+						channel = switch_core_session_get_channel(oglobals.originate_status[i].peer_session);
 
 						switch_channel_wait_for_state_timeout(channel, CS_REPORTING, 5000);
 
@@ -3890,7 +3893,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 							switch_channel_set_timestamps(channel);
 						}
 
-						if (switch_ivr_generate_json_cdr(originate_status[i].peer_session, &json_cdr, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) {
+						if (switch_ivr_generate_json_cdr(oglobals.originate_status[i].peer_session, &json_cdr, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) {
 							json_text = cJSON_PrintUnformatted(json_cdr);
 							switch_snprintf(buf, sizeof(buf), "%s_%d", json_cdr_var, ++cdr_total);
 							switch_channel_set_variable(caller_channel, buf, json_text);
@@ -3917,14 +3920,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 					} else {
 						*cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
 						for (i = 0; i < and_argc; i++) {
-							if (!peer_eligible(originate_status[i].peer_channel)) {
+							if (!peer_eligible(oglobals.originate_status[i].peer_channel)) {
 								continue;
 							}
 
-							wait_for_cause(originate_status[i].peer_channel);
+							wait_for_cause(oglobals.originate_status[i].peer_channel);
 
-							if (switch_channel_down_nosig(originate_status[i].peer_channel)) {
-								*cause = switch_channel_get_cause(originate_status[i].peer_channel);
+							if (switch_channel_down_nosig(oglobals.originate_status[i].peer_channel)) {
+								*cause = switch_channel_get_cause(oglobals.originate_status[i].peer_channel);
 								break;
 							}
 
@@ -4014,40 +4017,40 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 				switch_core_session_t *peer_session;
 				char *val;
 
-				if (!originate_status[i].peer_channel) {
+				if (!oglobals.originate_status[i].peer_channel) {
 					continue;
 				}
 
 				if (session) {
-					val = switch_core_session_sprintf(originate_status[i].peer_session, "%s;%s",
-													  switch_core_session_get_uuid(originate_status[i].peer_session),
-													  switch_channel_cause2str(switch_channel_get_cause(originate_status[i].peer_channel)));
+					val = switch_core_session_sprintf(oglobals.originate_status[i].peer_session, "%s;%s",
+													  switch_core_session_get_uuid(oglobals.originate_status[i].peer_session),
+													  switch_channel_cause2str(switch_channel_get_cause(oglobals.originate_status[i].peer_channel)));
 
 					switch_channel_add_variable_var_check(switch_core_session_get_channel(session), "originate_causes", val, SWITCH_FALSE, SWITCH_STACK_PUSH);
 				}
 
 				if (status == SWITCH_STATUS_SUCCESS) {
-					switch_channel_clear_flag(originate_status[i].peer_channel, CF_ORIGINATING);
-					if (bleg && *bleg && *bleg == originate_status[i].peer_session) {
+					switch_channel_clear_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING);
+					if (bleg && *bleg && *bleg == oglobals.originate_status[i].peer_session) {
 						continue;
 					}
-				} else if ((state = switch_channel_get_state(originate_status[i].peer_channel)) < CS_HANGUP &&
-						   switch_channel_test_flag(originate_status[i].peer_channel, CF_ORIGINATING)) {
-					if (!(state == CS_RESET || switch_channel_test_flag(originate_status[i].peer_channel, CF_TRANSFER) ||
-						  switch_channel_test_flag(originate_status[i].peer_channel, CF_REDIRECT) ||
-						  switch_channel_test_flag(originate_status[i].peer_channel, CF_BRIDGED))) {
+				} else if ((state = switch_channel_get_state(oglobals.originate_status[i].peer_channel)) < CS_HANGUP &&
+						   switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING)) {
+					if (!(state == CS_RESET || switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_TRANSFER) ||
+						  switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_REDIRECT) ||
+						  switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_BRIDGED))) {
 						if (caller_channel && switch_channel_test_flag(caller_channel, CF_INTERCEPTED)) {
-							switch_channel_set_flag(originate_status[i].peer_channel, CF_INTERCEPT);
+							switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_INTERCEPT);
 						}
-						switch_channel_hangup(originate_status[i].peer_channel, *cause);
+						switch_channel_hangup(oglobals.originate_status[i].peer_channel, *cause);
 					}
 				}
-				switch_channel_clear_flag(originate_status[i].peer_channel, CF_ORIGINATING);
+				switch_channel_clear_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING);
 
-				peer_session = originate_status[i].peer_session;
-				originate_status[i].down_session = originate_status[i].peer_session;
-				originate_status[i].peer_session = NULL;
-				originate_status[i].peer_channel = NULL;
+				peer_session = oglobals.originate_status[i].peer_session;
+				oglobals.originate_status[i].down_session = oglobals.originate_status[i].peer_session;
+				oglobals.originate_status[i].peer_session = NULL;
+				oglobals.originate_status[i].peer_channel = NULL;
 
 				switch_core_session_rwunlock(peer_session);
 			}
@@ -4062,11 +4065,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
 						switch_channel_t *pchannel;
 						const char *cause_str;
 
-						if (!originate_status[i].down_session) {
+						if (!oglobals.originate_status[i].down_session) {
 							continue;
 						}
 
-						pchannel = switch_core_session_get_channel(originate_status[i].down_session);
+						pchannel = switch_core_session_get_channel(oglobals.originate_status[i].down_session);
 						wait_for_cause(pchannel);
 
 						if (switch_channel_down_nosig(pchannel)) {