diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-12-11 21:21:31 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-12-11 21:21:31 +0000 |
commit | 4e006d017efca7ec6da6b6f4e1826f7e37fa6d56 (patch) | |
tree | f8f6c696565ad34ccb31a6ad6a828ef1fe3b4150 /res/res_timing_pthread.c | |
parent | b7a892e38434a7418c53593a1f8bc4c2be8276c4 (diff) |
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: http://svn.digium.com/svn/asterisk/trunk@163241 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_timing_pthread.c')
-rw-r--r-- | res/res_timing_pthread.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/res/res_timing_pthread.c b/res/res_timing_pthread.c index 20999caf6..0afe9c9bf 100644 --- a/res/res_timing_pthread.c +++ b/res/res_timing_pthread.c @@ -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); |