]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8234 #resolve
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 9 Oct 2015 15:54:51 +0000 (10:54 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Fri, 9 Oct 2015 18:00:15 +0000 (13:00 -0500)
src/mod/applications/mod_dptools/mod_dptools.c

index cf6fd956f5f09c2a7bf4c57aaa74f65eec12979d..cf31deea754d3b8e27332acbfb41469fca69b9ca 100644 (file)
@@ -2424,15 +2424,30 @@ static void att_xfer_set_result(switch_channel_t *channel, switch_status_t statu
        switch_channel_set_variable(channel, SWITCH_ATT_XFER_RESULT_VARIABLE, status == SWITCH_STATUS_SUCCESS ? "success" : "failure");
 }
 
-SWITCH_STANDARD_APP(att_xfer_function)
+struct att_obj {
+       switch_core_session_t *session;
+       const char *data;
+       int running;
+};
+
+void *SWITCH_THREAD_FUNC att_thread_run(switch_thread_t *thread, void *obj)
 {
+       struct att_obj *att = (struct att_obj *) obj;
+       switch_core_session_t *session = att->session;
        switch_core_session_t *peer_session = NULL;
+       const char *data = att->data;
        switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING;
        switch_channel_t *channel = switch_core_session_get_channel(session), *peer_channel = NULL;
        const char *bond = NULL;
        switch_core_session_t *b_session = NULL;
        switch_bool_t follow_recording = switch_true(switch_channel_get_variable(channel, "recording_follow_attxfer"));
-       
+
+       att->running = 1;
+
+       if (switch_core_session_read_lock(session) != SWITCH_STATUS_SUCCESS) {
+               return NULL;
+       }
+               
        bond = switch_channel_get_partner_uuid(channel);
        switch_channel_set_variable(channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE, bond);
        switch_core_event_hook_add_state_change(session, tmp_hanguphook);
@@ -2505,6 +2520,35 @@ SWITCH_STANDARD_APP(att_xfer_function)
 
        switch_channel_set_variable(channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE, NULL);
        switch_channel_clear_flag(channel, CF_XFER_ZOMBIE);
+
+       switch_core_session_rwunlock(session);
+       att->running = 0;
+
+       return NULL;
+}
+
+SWITCH_STANDARD_APP(att_xfer_function)
+{
+       switch_thread_t *thread;
+       switch_threadattr_t *thd_attr = NULL;
+       switch_memory_pool_t *pool = switch_core_session_get_pool(session);
+       struct att_obj *att;
+       switch_channel_t *channel = switch_core_session_get_channel(session);
+
+       switch_threadattr_create(&thd_attr, pool);
+       switch_threadattr_detach_set(thd_attr, 1);
+       switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+       switch_threadattr_detach_set(thd_attr, 1);
+
+       att = switch_core_session_alloc(session, sizeof(*att));
+       att->running = -1;
+       att->session = session;
+       att->data = switch_core_session_strdup(session, data);
+       switch_thread_create(&thread, thd_attr, att_thread_run, att, pool);
+
+       while(att->running && switch_channel_up(channel)) {
+               switch_yield(100000);
+       }
 }
 
 SWITCH_STANDARD_APP(read_function)