]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[core] refactor originate internals (oglobals) 616/head
authorMike Jerris <mike@signalwire.com>
Thu, 7 May 2020 17:04:54 +0000 (11:04 -0600)
committerAndrey Volk <andywolk@gmail.com>
Thu, 7 May 2020 20:28:57 +0000 (00:28 +0400)
src/switch_ivr_originate.c

index 4120513c58ba5738678f86a2c34d38cba2f6add6..48ec669a3197e90554f7b75a778f3d50a8ea9211 100644 (file)
@@ -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)) {