Fix a problem where continuous mode will get inadvertently get turned off if set_rate()

is used while continuous mode was already turned on.

(closes issue #13738)
Reported by: smurfix
Patches:
      res.patch.fixed uploaded by smurfix (license 547)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@163241 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2008-12-11 21:21:31 +00:00
parent 81b642c8c3
commit 06c56e1381

View File

@@ -151,6 +151,23 @@ static void pthread_timer_close(int handle)
ao2_ref(timer, -1);
}
static void set_state(struct pthread_timer *timer)
{
unsigned int rate = timer->rate;
if (rate) {
timer->state = TIMER_STATE_TICKING;
timer->interval = roundf(1000.0 / ((float) rate));
timer->start = ast_tvnow();
} else {
timer->state = TIMER_STATE_IDLE;
timer->interval = 0;
timer->start = ast_tv(0, 0);
}
timer->tick_count = 0;
}
static int pthread_timer_set_rate(int handle, unsigned int rate)
{
struct pthread_timer *timer;
@@ -169,10 +186,10 @@ static int pthread_timer_set_rate(int handle, unsigned int rate)
ao2_lock(timer);
timer->rate = rate;
timer->state = rate ? TIMER_STATE_TICKING : TIMER_STATE_IDLE;
timer->interval = rate ? roundf(1000.0 / ((float) rate)) : 0;
timer->start = rate ? ast_tvnow() : ast_tv(0, 0);
timer->tick_count = 0;
if (timer->state != TIMER_STATE_CONTINUOUS) {
set_state(timer);
}
ao2_unlock(timer);
ao2_ref(timer, -1);
@@ -229,7 +246,7 @@ static int pthread_timer_disable_continuous(int handle)
}
ao2_lock(timer);
timer->state = timer->rate ? TIMER_STATE_TICKING : TIMER_STATE_IDLE;
set_state(timer);
read_pipe(timer->pipe[PIPE_READ], 0, 1);
ao2_unlock(timer);