]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
more stuff
authorAnthony Minessale <anthony.minessale@gmail.com>
Fri, 14 Nov 2008 23:31:21 +0000 (23:31 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Fri, 14 Nov 2008 23:31:21 +0000 (23:31 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10410 d0543943-73ff-0310-b7d9-9358b9ac24b2

35 files changed:
src/include/switch_core.h
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_fsv/mod_fsv.c
src/mod/applications/mod_skel/mod_skel.c
src/mod/asr_tts/mod_cepstral/mod_cepstral.c
src/mod/endpoints/mod_dingaling/mod_dingaling.c
src/mod/endpoints/mod_iax/mod_iax.c
src/mod/endpoints/mod_loopback/mod_loopback.c
src/mod/endpoints/mod_portaudio/pablio.c
src/mod/endpoints/mod_reference/mod_reference.c
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/sofia_glue.c
src/mod/endpoints/mod_unicall/mod_unicall.c
src/mod/endpoints/mod_woomera/mod_woomera.c
src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c
src/mod/event_handlers/mod_event_socket/mod_event_socket.c
src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c
src/mod/formats/mod_shout/mod_shout.c
src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
src/switch_apr.c
src/switch_channel.c
src/switch_console.c
src/switch_core.c
src/switch_core_memory.c
src/switch_core_sqldb.c
src/switch_core_state_machine.c
src/switch_event.c
src/switch_ivr.c
src/switch_ivr_async.c
src/switch_ivr_bridge.c
src/switch_ivr_originate.c
src/switch_log.c
src/switch_rtp.c
src/switch_stun.c
src/switch_time.c

index 64e49d3b3e4e59911dfd5571bc5417a7937232bb..f264a21d53a15632f01fb7ff197dfce76efca48a 100644 (file)
@@ -1682,8 +1682,8 @@ SWITCH_DECLARE(uint32_t) switch_core_default_dtmf_duration(uint32_t duration);
 SWITCH_DECLARE(switch_status_t) switch_console_set_complete(const char *string);
 SWITCH_DECLARE(switch_status_t) switch_console_set_alias(const char *string);
 SWITCH_DECLARE(int) switch_system(const char *cmd, switch_bool_t wait);
-SWITCH_DECLARE(void) switch_cond_yield(uint32_t ms);
-
+SWITCH_DECLARE(void) switch_cond_yield(switch_interval_time_t t);
+SWITCH_DECLARE(void) switch_cond_next();
 ///\}
 
 /*!
index cdd3bda7885e3269c5e79a56dc842d25bd30e979..6136fc5ce6455b5cf02d54549bcfdb978a3716ce 100644 (file)
@@ -1195,7 +1195,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
        if (conference->video_running == 1) {
                conference->video_running = -1;
                while (conference->video_running) {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
@@ -2010,7 +2010,7 @@ static void conference_loop_output(conference_member_t *member)
                if (use_timer) {
                        switch_core_timer_next(&timer);
                } else {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
 
        }                                                       /* Rinse ... Repeat */
@@ -2032,7 +2032,7 @@ static void conference_loop_output(conference_member_t *member)
 
        /* Wait for the input thread to end */
        while (switch_test_flag(member, MFLAG_ITHREAD)) {
-               switch_yield(1000);
+               switch_cond_next();
        }
 }
 
index 533e843aceaedaa8560a40ae0633c9f190f887c9..868d1266d7ba4a2c64bf62bca8d1c35553d863e9 100644 (file)
@@ -203,7 +203,7 @@ SWITCH_STANDARD_APP(record_fsv_function)
 
        if (eh.up) {
                while (eh.up) {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
@@ -320,7 +320,7 @@ SWITCH_STANDARD_APP(play_fsv_function)
                                switch_core_session_write_video_frame(session, &vid_frame, SWITCH_IO_FLAG_NONE, 0);
                        }
                        if (ts && last && last != ts) {
-                               switch_yield(1000);
+                               switch_cond_next();
                        }
                        last = ts;
                } else {
index 5627057e7a18a41ae4c351e8ee689eb0f462fa27..8d1aa4c660b405dd969b9c49c0c0521d7f37f4cf 100644 (file)
@@ -64,7 +64,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_skel_runtime)
 {
        while(looping)
        {
-               switch_yield(1000);
+               switch_cond_next();
        }
        return SWITCH_STATUS_TERM;
 }
index c91c2746fd6674fd982f08e040ce09064c1fa51b..9d7ae2213fa564fdd1998a54476f5723747876eb 100644 (file)
@@ -302,7 +302,7 @@ static switch_status_t cepstral_speech_read_tts(switch_speech_handle_t *sh, void
                                status = SWITCH_STATUS_SUCCESS;
                                break;
                        }
-                       switch_yield(1000);
+                       switch_cond_next();
                        continue;
                }
 
index e557c1784065c3ad91cd60fb0aa5947549d6d43b..94c33f92d604efb4af21db65dc9a0feed4f126bf 100644 (file)
@@ -1112,7 +1112,7 @@ static switch_status_t negotiate_media(switch_core_session_t *session)
                if (switch_test_flag(tech_pvt, TFLAG_BYE) || !switch_test_flag(tech_pvt, TFLAG_IO)) {
                        goto done;
                }
-               switch_yield(1000);
+               switch_cond_next();
        }
 
        if (switch_channel_get_state(channel) >= CS_HANGUP || switch_test_flag(tech_pvt, TFLAG_BYE)) {
index 6d65b95cdab17d24f372a306d2521af0dc46afee..249179f3ba7db172ca65cfbc522cdab151013a66 100644 (file)
@@ -583,7 +583,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
        while (switch_test_flag(tech_pvt, TFLAG_IO)) {
 
                if (!switch_test_flag(tech_pvt, TFLAG_CODEC)) {
-                       switch_yield(1000);
+                       switch_cond_next();
                        continue;
                }
                if (switch_test_flag(tech_pvt, TFLAG_BREAK)) {
@@ -615,7 +615,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
                        return SWITCH_STATUS_SUCCESS;
                }
 
-               switch_yield(1000);
+               switch_cond_next();
                if (++ms_count >= 30000) {
                        break;
                }
index dbd49739a57522c498fca421a57289d38bd5cbf7..3aa63fd4b7695309a97e41935f91a4ef3d08ae05 100644 (file)
@@ -491,7 +491,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
                        break;
                }
 
-               switch_yield(1000);
+               switch_cond_next();
        }
 
        if (switch_test_flag(tech_pvt, TFLAG_LINKED)) {
index 5ec4a1da1556b14a5aceb9e0d68e1cdf59b61c19..739cc3875226f814c808e01a49f3b921d7b74fef 100644 (file)
@@ -131,7 +131,7 @@ long WriteAudioStream(PABLIO_Stream * aStream, void *data, long numFrames, switc
                                PaUtil_FlushRingBuffer(&aStream->outFIFO);
                                return 0;
                        }
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
        return numFrames;
@@ -169,7 +169,7 @@ long ReadAudioStream(PABLIO_Stream * aStream, void *data, long numFrames, switch
                if (bytesRead) {
                        p += bytesRead;
                } else {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
index 0b40217582c60447361aee2fb9c842082284e795..52e6285c209fd84953d8fec4de506803a2fa6291 100644 (file)
@@ -309,7 +309,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
                        return SWITCH_STATUS_SUCCESS;
                }
 
-               switch_yield(1000);
+               switch_cond_next();
        }
 
 
index 93bf1386c6d158b1a12dcbaec0e6f681aecae0d1..f5bf788e0bdd5a2be91bd184d4ea53f5f4823dd8 100644 (file)
@@ -453,7 +453,7 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)
                        // Maybe we should timeout?
                        
                        while(switch_channel_ready(channel) && !switch_test_flag(tech_pvt, TFLAG_3PCC_HAS_ACK)) {
-                               switch_yield(1000);
+                               switch_cond_next();
                        }
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "3PCC-PROXY, Done waiting for ACK\n");
                }
@@ -2549,7 +2549,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_sofia_shutdown)
        switch_event_unbind_callback(general_event_handler);
        
        while (mod_sofia_globals.threads) {
-               switch_yield(1000);
+               switch_cond_next();
                if (++sanity >= 10000) {
                        break;
                }
index f15ae3bce03860dcba9018c19d1a42b14ffe0159..344da4f1cdc4fb38470c4a4ce08367b242c657cb 100644 (file)
@@ -3159,7 +3159,7 @@ char *sofia_glue_execute_sql2str(sofia_profile_t *profile, switch_mutex_t *mutex
                                break;
                        } else if (result == SWITCH_CORE_DB_BUSY) {
                                running++;
-                               switch_yield(1000);
+                               switch_cond_next();
                                continue;
                        }
                        break;
index fbf7d582319762c416538fabe1b8865d6f9ebea8..971dbbff29f90cb59cb606d3435797139072c66b 100644 (file)
@@ -1052,7 +1052,7 @@ static switch_status_t unicall_read_frame(switch_core_session_t *session, switch
             return SWITCH_STATUS_SUCCESS;
         }
 
-        switch_yield(1000);
+        switch_cond_next();
     }
 
     return SWITCH_STATUS_FALSE;
index 95008f1a7782022872674deecb1a9e14b4d761ca..67b8397321f016585e3afbd75e54d1d18bb2e08e 100644 (file)
@@ -338,7 +338,7 @@ static switch_status_t woomera_read_frame(switch_core_session_t *session, switch
                if (switch_test_flag(tech_pvt, TFLAG_MEDIA)) {
                        break;
                }
-               switch_yield(1000);
+               switch_cond_next();
        }
 
        if (!tech_pvt->udp_socket) {
index c567c4d2d8349a1249bdaf6568ea31ecf0da1881..008505bafdc03beef6f616f9a6252ab06d3e2672 100644 (file)
@@ -253,7 +253,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_event_multicast_shutdown)
                globals.running = -1;
                while (x < 100000 && globals.running) {
                        x++;
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
index 550b2af5b38bcf53cb2c58470d34a5c7353c0788..344a3b46626f14b46614c240b698ef1964b5264e 100644 (file)
@@ -1049,7 +1049,7 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event,
                        }
                }
                if (do_sleep) {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
index 67b473be1a8e6028a897ad097694c58ea5a43836..c21550a0ae29f80475e6c467f7b1154f0d6dd396 100644 (file)
@@ -303,7 +303,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_zeroconf_runtime)
                sw_uint32 ms;
                ms = 100;
                sw_discovery_step(globals.discovery, &ms);
-               switch_yield(1000);
+               switch_cond_next();
        }
        RUNNING = 0;
        return SWITCH_STATUS_TERM;
index 90f4d7b2f27982202c106e4608fff487e7cf7932..5f27188d60efcf45fa0192146c27aac66fc237cd 100644 (file)
@@ -1195,7 +1195,7 @@ void do_telecast(switch_stream_handle_t *stream)
                                switch_buffer_unlock(buffer);
                        } else {
                                if (!bytes) {
-                                       switch_yield(1000);
+                                       switch_cond_next();
                                        continue;
                                }
                                memset(buf, 0, bytes);
index 6a2911263b108a70b55350a5051f41505e0bbde2..00babaf5b4a60b8f75498a16e538f54f2175e4c3 100644 (file)
@@ -2135,7 +2135,7 @@ static JSBool session_wait_for_media(JSContext * cx, JSObject * obj, uintN argc,
                        break;
                }
 
-               switch_yield(1000);
+               switch_cond_next();
        }
        JS_ResumeRequest(cx, saveDepth);
        check_hangup_hook(jss, &ret);
@@ -2179,7 +2179,7 @@ static JSBool session_wait_for_answer(JSContext * cx, JSObject * obj, uintN argc
                        break;
                }
 
-               switch_yield(1000);
+               switch_cond_next();
        }
        JS_ResumeRequest(cx, saveDepth);
        check_hangup_hook(jss, &ret);
index 4583d7a5565438daf324782ec2cb3cfbcbd4e33b..bf994aa7064b492b21655e2915cc4a633ccc47bd 100644 (file)
@@ -683,7 +683,7 @@ SWITCH_DECLARE(switch_status_t) switch_socket_send(switch_socket_t *sock, const
                                status = SWITCH_STATUS_FALSE;
                                break;
                        }
-                       switch_yield(1000);
+                       switch_cond_next();
                } else {
                        to_count = 0;
                }
index df242ad640812ed001c5068ae8953071b47ca7ee..82a3d5be32b135abb07375970eddc33b35253953 100644 (file)
@@ -683,7 +683,7 @@ SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, sw
                if (mystate != ostate || state >= CS_HANGUP || state == want_state) {
                        break;
                }
-               switch_yield(1000);
+               switch_cond_next();
        }
 }
 
@@ -709,7 +709,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_wait_for_flag(switch_channel_t *c
                        }
                }
 
-               switch_yield(1000);
+               switch_cond_next();
 
                if (super_channel && !switch_channel_ready(super_channel)) {
                        return SWITCH_STATUS_FALSE;
index 6c367301129ce3113e7062b32859d468bb6baa10..b44d5347555303d546c63752ec6f21b528d90c62 100644 (file)
@@ -449,7 +449,7 @@ static void *SWITCH_THREAD_FUNC console_thread(switch_thread_t *thread, void *ob
                                free(cmd);
                        }
                }
-               switch_yield(1000);
+               switch_cond_next();
        }
 
        switch_core_destroy_memory_pool(&pool);
index c9d93e723cb11fa166a24251d3d8d559b08fa5a7..0c1132cd5ff95fe9298eca98b5dd653c7b7e17ba 100644 (file)
@@ -360,6 +360,7 @@ SWITCH_DECLARE(void) switch_core_launch_thread(switch_thread_start_t func, void
                }
                ts->objs[0] = obj;
                switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+               switch_threadattr_priority_increase(thd_attr);
                switch_thread_create(&thread, thd_attr, func, ts, pool);
        }
 }
index 2f0c3d9f16c0da51c78f54e8ad704770d95def1b..1c88cb9edb9e3e38ba769e86c92c3720a6382c4e 100644 (file)
@@ -444,7 +444,7 @@ void switch_core_memory_stop(void)
 #ifndef INSTANTLY_DESTROY_POOLS
        memory_manager.pool_thread_running = -1;
        while (memory_manager.pool_thread_running) {
-               switch_yield(1000);
+               switch_cond_next();
        }
 #endif
 }
@@ -503,7 +503,7 @@ switch_memory_pool_t *switch_core_memory_init(void)
        switch_thread_create(&thread, thd_attr, pool_thread, NULL, memory_manager.memory_pool);
 
        while (!memory_manager.pool_thread_running) {
-               switch_yield(1000);
+               switch_cond_next();
        }
 #endif
 
index 7727e0729b09a1ea8e8ee1a22b8d11d5f8ed9dc1..1bc23c83353dcc84cdf6ea86729a70fe65056dc4 100644 (file)
@@ -220,7 +220,7 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t * thread,
                }
 
                if (nothing_in_queue) {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
index dff6ef2d1bab8c694b9597705a582d37a3629669..35e7219d2f288247a8ede844d7102106cf458f0e 100644 (file)
@@ -462,7 +462,7 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session)
 
                if (endstate == switch_channel_get_running_state(session->channel)) {
                        if (endstate == CS_NEW) {
-                               switch_yield(1000);
+                               switch_cond_next();
                        } else {
                                switch_thread_cond_wait(session->cond, session->mutex);
                        }
index 22e8ecd93f1275d8c6b3daa1236c8a09525b4c55..5d322690bca253c59a652637a15b7bf213a6b1f8 100644 (file)
@@ -446,7 +446,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void)
        }
 
        while (x < 10000 && THREAD_COUNT) {
-               switch_yield(1000);
+               switch_cond_next();
                if (THREAD_COUNT == last) {
                        x++;
                }
@@ -537,7 +537,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_init(switch_memory_pool_t *pool)
        switch_thread_create(&thread, thd_attr, switch_event_thread, EVENT_QUEUE[2], RUNTIME_POOL);
 
        while (!THREAD_COUNT) {
-               switch_yield(1000);
+               switch_cond_next();
        }
 
 
index 93d7bbbae357dfd5477e990a55382ff763d933b9..4b2d1282f586ec4942e0a01a1d9614ac57d07838 100644 (file)
@@ -112,13 +112,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session,
                }
 
                if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
-                       switch_yield(1000);
+                       switch_cond_next();
                        continue;
                }
 
                if (switch_channel_test_flag(channel, CF_SERVICE) ||
                        (!switch_channel_test_flag(channel, CF_ANSWERED) && !switch_channel_test_flag(channel, CF_EARLY_MEDIA))) {
-                       switch_yield(1000);
+                       switch_cond_next();
                } else {
                        status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
                        if (!SWITCH_READ_ACCEPTABLE(status)) {
@@ -709,7 +709,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s
                }
 
                if (switch_channel_test_flag(channel, CF_SERVICE)) {
-                       switch_yield(1000);
+                       switch_cond_next();
                } else {
                        status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
                }
@@ -824,7 +824,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess
                }
 
                if (switch_channel_test_flag(channel, CF_SERVICE)) {
-                       switch_yield(1000);
+                       switch_cond_next();
                } else {
                        status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
                        if (!SWITCH_READ_ACCEPTABLE(status)) {
index 5eb053c43293c1303e6776e3bbf20535401f8bd8..4380e51312a45769a93d11f054ff633986a7f9ab 100644 (file)
@@ -157,7 +157,7 @@ SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session, swi
 #ifdef SWITCH_VIDEO_IN_THREADS
        if (eh.up) {
                while (eh.up) {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 #endif
index 1532b888990fcf57f6e43b2bfa2dcefac3ccba06..16290b2d9d4dbaff37c4c92fad4a2164627104c5 100644 (file)
@@ -913,7 +913,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses
                        }
 
                        while (switch_channel_get_state(peer_channel) == CS_EXCHANGE_MEDIA) {
-                               switch_yield(1000);
+                               switch_cond_next();
                        }
 
                        switch_core_session_rwunlock(peer_session);
index 45fcfae055f19b39b49a9f0a99a4344fe14cdb50..f4c4505524f9dadc3748de40284466487fa5786f 100644 (file)
@@ -497,7 +497,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_wait_for_answer(switch_core_session_t
                                }
                        }
                } else {
-                       switch_yield(1000);
+                       switch_cond_next();
                }
        }
 
@@ -1199,7 +1199,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
                                                goto notready;
                                        }
                                        
-                                       switch_yield(10000);
+                                       switch_yield(100000);
                                }
 
                                check_per_channel_timeouts(peer_channels, per_channel_timelimit_sec, per_channel_progress_timelimit_sec, and_argc, start);
@@ -1432,7 +1432,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
                                        }
 
                                } else {
-                                       switch_yield(10000);
+                                       switch_yield(100000);
                                }
                                
                        }
index cb39b4c0e4e550f866c0338cbf63c25ce21e1e85..4804f6dc943d6c2471be6096224ed5e92c3b9e98 100644 (file)
@@ -402,7 +402,7 @@ SWITCH_DECLARE(switch_status_t) switch_log_init(switch_memory_pool_t *pool, swit
        switch_thread_create(&thread, thd_attr, log_thread, NULL, LOG_POOL);
 
        while (!THREAD_RUNNING) {
-               switch_yield(1000);
+               switch_cond_next();
        }
 
        if (colorize) {
@@ -438,7 +438,7 @@ SWITCH_DECLARE(switch_status_t) switch_log_shutdown(void)
        THREAD_RUNNING = -1;
        switch_queue_push(LOG_QUEUE, NULL);
        while (THREAD_RUNNING) {
-               switch_yield(1000);
+               switch_cond_next();
        }
        switch_core_memory_reclaim_logger();
 
index 9a4f2fb06c1086e86bb3e72ccb449b2850aaa61d..fb83e932910a74e9a4fee5cda9f21819586ba07c 100644 (file)
@@ -558,7 +558,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_set_local_address(switch_rtp_t *rtp_s
                if (++x > 1000) {
                        break;
                }
-               switch_yield(1000);
+               switch_cond_next();
        }
        switch_socket_opt_set(new_sock, SWITCH_SO_NONBLOCK, FALSE);
 
@@ -1537,7 +1537,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                                rtp_session->recv_msg.header.ts = htonl(jb_frame->ts);
                        } else if (!bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) {        /* We're late! We're Late! */
                                if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK) && status == SWITCH_STATUS_BREAK) {
-                                       switch_yield(1000);
+                                       switch_cond_next();
                                        continue;
                                }
                                
index ee0cc4be5764cefce82af6833ff9648b0444ce1d..c68da753ee4d71ec88da97cf2858ff56e849566c 100644 (file)
@@ -518,7 +518,7 @@ SWITCH_DECLARE(switch_status_t) switch_stun_lookup(char **ip,
                        switch_socket_close(sock);
                        return SWITCH_STATUS_TIMEOUT;
                }
-               switch_yield(1000);
+               switch_cond_next();
        }
        switch_socket_close(sock);
 
index abc5f73836bd2d8e79fbd27cb8d92e607b61db27..405e6ddb112c0c23962d55bb41b2b41d71d33744 100644 (file)
@@ -172,14 +172,14 @@ SWITCH_DECLARE(void) switch_micro_sleep(switch_interval_time_t t)
 SWITCH_DECLARE(void) switch_sleep(switch_interval_time_t t)
 {
 
-       if (t < 1000) {
+       if (t < 1000 || t >= 10000) {
                do_sleep(t);
                return;
        }
 
 #ifndef DISABLE_1MS_COND
        if (globals.use_cond_yield == 1) {
-               switch_cond_yield((uint32_t)(t / 1000));
+               switch_cond_yield(t);
                return;
        }
 #endif 
@@ -188,20 +188,39 @@ SWITCH_DECLARE(void) switch_sleep(switch_interval_time_t t)
 }
 
 
-SWITCH_DECLARE(void) switch_cond_yield(uint32_t ms)
+SWITCH_DECLARE(void) switch_cond_next(void)
 {
-       if (!ms) return;
-
-       if (globals.use_cond_yield != 1) {
-               do_sleep(ms * 1000);
+#ifdef DISABLE_1MS_COND
+       do_sleep(1000);
+#else
+       if (!runtime.timestamp || globals.use_cond_yield != 1) {
+               do_sleep(1000);
                return;
        }
-
        switch_mutex_lock(TIMER_MATRIX[1].mutex);
-       while(globals.RUNNING == 1 && globals.use_cond_yield == 1 && ms--) {
-               switch_thread_cond_wait(TIMER_MATRIX[1].cond, TIMER_MATRIX[1].mutex);
-       }
+       switch_thread_cond_wait(TIMER_MATRIX[1].cond, TIMER_MATRIX[1].mutex);
        switch_mutex_unlock(TIMER_MATRIX[1].mutex);
+#endif
+}
+
+SWITCH_DECLARE(void) switch_cond_yield(switch_interval_time_t t)
+{
+       switch_time_t want;
+       if (!t) return;
+
+       if (!runtime.timestamp || globals.use_cond_yield != 1) {
+               do_sleep(t);
+               return;
+       }
+       want = runtime.timestamp + t;
+       while(globals.RUNNING == 1 && globals.use_cond_yield == 1 && runtime.timestamp < want) {
+               switch_mutex_lock(TIMER_MATRIX[1].mutex);
+               if (runtime.timestamp < want) {
+                       switch_thread_cond_wait(TIMER_MATRIX[1].cond, TIMER_MATRIX[1].mutex);
+               }
+               switch_mutex_unlock(TIMER_MATRIX[1].mutex);
+       }
+
 
 }
 
@@ -292,22 +311,28 @@ static switch_status_t timer_sync(switch_timer_t *timer)
 static switch_status_t timer_next(switch_timer_t *timer)
 {
        timer_private_t *private_info = timer->private_info;
-       timer_step(timer);
 
-#if 1
-       switch_mutex_lock(TIMER_MATRIX[timer->interval].mutex);
-       while (globals.RUNNING == 1 && private_info->ready && TIMER_MATRIX[timer->interval].tick < private_info->reference) {
-               check_roll();
-               switch_thread_cond_wait(TIMER_MATRIX[timer->interval].cond, TIMER_MATRIX[timer->interval].mutex);       
-       }
-       switch_mutex_unlock(TIMER_MATRIX[timer->interval].mutex);
+#ifdef DISABLE_1MS_COND
+       int cond_index = timer->interval;
 #else
+       int cond_index = 1;
+#endif
+
+       timer_step(timer);
+       
        while (globals.RUNNING == 1 && private_info->ready && TIMER_MATRIX[timer->interval].tick < private_info->reference) {
                check_roll();
-               do_sleep(1000);
+               if (globals.use_cond_yield == 1) {
+                       switch_mutex_lock(TIMER_MATRIX[cond_index].mutex);              
+                       if (TIMER_MATRIX[timer->interval].tick < private_info->reference) {
+                               switch_thread_cond_wait(TIMER_MATRIX[cond_index].cond, TIMER_MATRIX[cond_index].mutex); 
+                       }
+                       switch_mutex_unlock(TIMER_MATRIX[cond_index].mutex);
+               } else {
+                       do_sleep(1000);
+               }
        }
-#endif
-
+       
        if (globals.RUNNING == 1) {
                return SWITCH_STATUS_SUCCESS;
        }
@@ -486,7 +511,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(softtimer_runtime)
                                if ((current_ms % x) == 0) {
                                        if (TIMER_MATRIX[x].count) {
                                                TIMER_MATRIX[x].tick++;
-#if 1
+#ifdef DISABLE_1MS_COND
                                                if (TIMER_MATRIX[x].mutex && switch_mutex_trylock(TIMER_MATRIX[x].mutex) == SWITCH_STATUS_SUCCESS) {
                                                        switch_thread_cond_broadcast(TIMER_MATRIX[x].cond);
                                                        switch_mutex_unlock(TIMER_MATRIX[x].mutex);
@@ -726,11 +751,13 @@ SWITCH_MODULE_LOAD_FUNCTION(softtimer_load)
        timer_interface->timer_destroy = timer_destroy;
 
        /* indicate that the module should continue to be loaded */
-       return SWITCH_STATUS_SUCCESS;
+       return SWITCH_STATUS_NOUNLOAD;
 }
 
 SWITCH_MODULE_SHUTDOWN_FUNCTION(softtimer_shutdown)
 {
+       globals.use_cond_yield = 0;
+
        if (globals.RUNNING == 1) {
                switch_mutex_lock(globals.mutex);
                globals.RUNNING = -1;