From 66feec2da5976852f75863856c4165bca785d993 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 7 Feb 2007 18:44:00 +0000 Subject: [PATCH] timer mojo git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4149 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_core.h | 3 +- src/include/switch_module_interfaces.h | 2 +- src/mod/timers/mod_softtimer/mod_softtimer.c | 35 ++++++++++++++------ src/switch_core.c | 4 +-- src/switch_rtp.c | 6 ++-- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 826b88ebd1..da673465ac 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -905,9 +905,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_timer_step(switch_timer_t *timer); /*! \brief Check if the current step has been exceeded \param timer the timer to wait on + \param diff the remaining number of ms \return the newest sample count */ -SWITCH_DECLARE(switch_status_t) switch_core_timer_check(switch_timer_t *timer); +SWITCH_DECLARE(switch_status_t) switch_core_timer_check(switch_timer_t *timer, uint32_t *diff); /*! \brief Destroy an allocated timer diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index e8abf5efcf..37bc6497eb 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -245,7 +245,7 @@ struct switch_timer_interface { /*! function to step the timer one step */ switch_status_t (*timer_step)(switch_timer_t *); /*! function to check if the current step has expired */ - switch_status_t (*timer_check)(switch_timer_t *); + switch_status_t (*timer_check)(switch_timer_t *, uint32_t *); /*! function to deallocate the timer */ switch_status_t (*timer_destroy)(switch_timer_t *); const struct switch_timer_interface *next; diff --git a/src/mod/timers/mod_softtimer/mod_softtimer.c b/src/mod/timers/mod_softtimer/mod_softtimer.c index 0572d54949..e24e5e01e1 100644 --- a/src/mod/timers/mod_softtimer/mod_softtimer.c +++ b/src/mod/timers/mod_softtimer/mod_softtimer.c @@ -78,8 +78,10 @@ static inline switch_status_t timer_step(switch_timer_t *timer) { timer_private_t *private_info = timer->private_info; - private_info->reference += timer->interval; - + while(private_info->reference <= TIMER_MATRIX[timer->interval].tick) { + private_info->reference += timer->interval; + } + return SWITCH_STATUS_SUCCESS; } @@ -87,28 +89,39 @@ static inline switch_status_t timer_step(switch_timer_t *timer) static inline switch_status_t timer_next(switch_timer_t *timer) { timer_private_t *private_info = timer->private_info; - + timer_step(timer); while (TIMER_MATRIX[timer->interval].tick < private_info->reference) { - switch_yield(1000); + uint64_t diff; + + if ((diff = (private_info->reference - TIMER_MATRIX[timer->interval].tick))) { + switch_yield(diff * 1000); + } } timer->samplecount += timer->samples; return SWITCH_STATUS_SUCCESS; } -static inline switch_status_t timer_check(switch_timer_t *timer) +static inline switch_status_t timer_check(switch_timer_t *timer, uint32_t *diff) { timer_private_t *private_info = timer->private_info; - switch_status_t status; + switch_status_t status = SWITCH_STATUS_SUCCESS; if (TIMER_MATRIX[timer->interval].tick < private_info->reference) { - status = SWITCH_STATUS_FALSE; + uint64_t _diff = private_info->reference - TIMER_MATRIX[timer->interval].tick; + *diff = (uint32_t) _diff; } else { - private_info->reference += timer->interval; - status = SWITCH_STATUS_SUCCESS; + *diff = 0; } + if (*diff) { + status = SWITCH_STATUS_FALSE; + } else { + timer_step(timer); + } + + return status; } @@ -159,8 +172,8 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod twice the granularity we need, we'll change it if we need anything smaller */ -#define STEP_MS 10 -#define STEP_MIC 10000 +#define STEP_MS 1 +#define STEP_MIC 1000 SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void) { switch_time_t reference = switch_time_now(); diff --git a/src/switch_core.c b/src/switch_core.c index 19e8b6debd..96661f977c 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1321,14 +1321,14 @@ SWITCH_DECLARE(switch_status_t) switch_core_timer_step(switch_timer_t *timer) return timer->timer_interface->timer_step(timer); } -SWITCH_DECLARE(switch_status_t) switch_core_timer_check(switch_timer_t *timer) +SWITCH_DECLARE(switch_status_t) switch_core_timer_check(switch_timer_t *timer, uint32_t *diff) { if (!timer->timer_interface) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Timer is not initilized!\n"); return SWITCH_STATUS_GENERR; } - return timer->timer_interface->timer_check(timer); + return timer->timer_interface->timer_check(timer, diff); } diff --git a/src/switch_rtp.c b/src/switch_rtp.c index b571cbc811..334b8814c7 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -711,6 +711,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ switch_size_t bytes = 0; switch_status_t status; uint8_t check = 1; + uint32_t diff = 0; if (!rtp_session->timer.interval) { rtp_session->last_time = switch_time_now(); @@ -757,7 +758,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ } if (rtp_session->timer.interval) { - check = (uint8_t)(switch_core_timer_check(&rtp_session->timer) == SWITCH_STATUS_SUCCESS); + check = (uint8_t)(switch_core_timer_check(&rtp_session->timer, &diff) == SWITCH_STATUS_SUCCESS); } if (check) { @@ -780,7 +781,8 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ if (status == SWITCH_STATUS_BREAK || bytes == 0) { if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_DATAWAIT)) { - switch_yield(rtp_session->ms_per_packet/2); + + switch_yield(diff * 1000); continue; } return 0;