diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 64e49d3b3e..f264a21d53 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -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(); ///\} /*! diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index cdd3bda788..6136fc5ce6 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -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(); } } diff --git a/src/mod/applications/mod_fsv/mod_fsv.c b/src/mod/applications/mod_fsv/mod_fsv.c index 533e843ace..868d1266d7 100644 --- a/src/mod/applications/mod_fsv/mod_fsv.c +++ b/src/mod/applications/mod_fsv/mod_fsv.c @@ -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 { diff --git a/src/mod/applications/mod_skel/mod_skel.c b/src/mod/applications/mod_skel/mod_skel.c index 5627057e7a..8d1aa4c660 100644 --- a/src/mod/applications/mod_skel/mod_skel.c +++ b/src/mod/applications/mod_skel/mod_skel.c @@ -64,7 +64,7 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_skel_runtime) { while(looping) { - switch_yield(1000); + switch_cond_next(); } return SWITCH_STATUS_TERM; } diff --git a/src/mod/asr_tts/mod_cepstral/mod_cepstral.c b/src/mod/asr_tts/mod_cepstral/mod_cepstral.c index c91c2746fd..9d7ae2213f 100644 --- a/src/mod/asr_tts/mod_cepstral/mod_cepstral.c +++ b/src/mod/asr_tts/mod_cepstral/mod_cepstral.c @@ -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; } diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index e557c17840..94c33f92d6 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -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)) { diff --git a/src/mod/endpoints/mod_iax/mod_iax.c b/src/mod/endpoints/mod_iax/mod_iax.c index 6d65b95cda..249179f3ba 100644 --- a/src/mod/endpoints/mod_iax/mod_iax.c +++ b/src/mod/endpoints/mod_iax/mod_iax.c @@ -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; } diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index dbd49739a5..3aa63fd4b7 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -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)) { diff --git a/src/mod/endpoints/mod_portaudio/pablio.c b/src/mod/endpoints/mod_portaudio/pablio.c index 5ec4a1da15..739cc38752 100644 --- a/src/mod/endpoints/mod_portaudio/pablio.c +++ b/src/mod/endpoints/mod_portaudio/pablio.c @@ -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(); } } diff --git a/src/mod/endpoints/mod_reference/mod_reference.c b/src/mod/endpoints/mod_reference/mod_reference.c index 0b40217582..52e6285c20 100644 --- a/src/mod/endpoints/mod_reference/mod_reference.c +++ b/src/mod/endpoints/mod_reference/mod_reference.c @@ -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(); } diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 93bf1386c6..f5bf788e0b 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -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; } diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index f15ae3bce0..344da4f1cd 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -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; diff --git a/src/mod/endpoints/mod_unicall/mod_unicall.c b/src/mod/endpoints/mod_unicall/mod_unicall.c index fbf7d58231..971dbbff29 100644 --- a/src/mod/endpoints/mod_unicall/mod_unicall.c +++ b/src/mod/endpoints/mod_unicall/mod_unicall.c @@ -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; diff --git a/src/mod/endpoints/mod_woomera/mod_woomera.c b/src/mod/endpoints/mod_woomera/mod_woomera.c index 95008f1a77..67b8397321 100644 --- a/src/mod/endpoints/mod_woomera/mod_woomera.c +++ b/src/mod/endpoints/mod_woomera/mod_woomera.c @@ -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) { diff --git a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c index c567c4d2d8..008505bafd 100644 --- a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c +++ b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c @@ -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(); } } diff --git a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c index 550b2af5b3..344a3b4662 100644 --- a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c +++ b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c @@ -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(); } } diff --git a/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c b/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c index 67b473be1a..c21550a0ae 100644 --- a/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c +++ b/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c @@ -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; diff --git a/src/mod/formats/mod_shout/mod_shout.c b/src/mod/formats/mod_shout/mod_shout.c index 90f4d7b2f2..5f27188d60 100644 --- a/src/mod/formats/mod_shout/mod_shout.c +++ b/src/mod/formats/mod_shout/mod_shout.c @@ -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); diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c index 6a2911263b..00babaf5b4 100644 --- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c +++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c @@ -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); diff --git a/src/switch_apr.c b/src/switch_apr.c index 4583d7a556..bf994aa706 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -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; } diff --git a/src/switch_channel.c b/src/switch_channel.c index df242ad640..82a3d5be32 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -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; diff --git a/src/switch_console.c b/src/switch_console.c index 6c36730112..b44d534755 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -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); diff --git a/src/switch_core.c b/src/switch_core.c index c9d93e723c..0c1132cd5f 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -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); } } diff --git a/src/switch_core_memory.c b/src/switch_core_memory.c index 2f0c3d9f16..1c88cb9edb 100644 --- a/src/switch_core_memory.c +++ b/src/switch_core_memory.c @@ -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 diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c index 7727e0729b..1bc23c8335 100644 --- a/src/switch_core_sqldb.c +++ b/src/switch_core_sqldb.c @@ -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(); } } diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index dff6ef2d1b..35e7219d2f 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -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); } diff --git a/src/switch_event.c b/src/switch_event.c index 22e8ecd93f..5d322690bc 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -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(); } diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 93d7bbbae3..4b2d1282f5 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -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)) { diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 5eb053c432..4380e51312 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -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 diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 1532b88899..16290b2d9d 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -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); diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 45fcfae055..f4c4505524 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -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); } } diff --git a/src/switch_log.c b/src/switch_log.c index cb39b4c0e4..4804f6dc94 100644 --- a/src/switch_log.c +++ b/src/switch_log.c @@ -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(); diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 9a4f2fb06c..fb83e93291 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -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; } diff --git a/src/switch_stun.c b/src/switch_stun.c index ee0cc4be57..c68da753ee 100644 --- a/src/switch_stun.c +++ b/src/switch_stun.c @@ -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); diff --git a/src/switch_time.c b/src/switch_time.c index abc5f73836..405e6ddb11 100644 --- a/src/switch_time.c +++ b/src/switch_time.c @@ -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 - while (globals.RUNNING == 1 && private_info->ready && TIMER_MATRIX[timer->interval].tick < private_info->reference) { - check_roll(); - do_sleep(1000); - } + 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(); + 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); + } + } + 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;