summaryrefslogtreecommitdiff
path: root/res/res_timing_timerfd.c
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2009-05-11 22:04:40 +0000
committerRussell Bryant <russell@russellbryant.com>2009-05-11 22:04:40 +0000
commit174697b7d15f49cb432f84c3f4465aa8bbce0ebb (patch)
tree0dc0bc096cc850238ca3f620a126f20ce0515aef /res/res_timing_timerfd.c
parent52541f5aeb7db910f943f8b6909ef40437cf34e9 (diff)
Fix some timer state corruption.
In res_timer_timerfd, handle the case that set_rate gets called while a timer is still in continuous mode. In this case, we want to remember the configured rate, but not actually set it until continuous mode has been disabled. Thanks to dvossel for finding and helping to debug the problem. (closes issue #15080) Reported by: dvossel Tested by: dvossel git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@193718 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_timing_timerfd.c')
-rw-r--r--res/res_timing_timerfd.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/res/res_timing_timerfd.c b/res/res_timing_timerfd.c
index 9688758f9..fb35ffb43 100644
--- a/res/res_timing_timerfd.c
+++ b/res/res_timing_timerfd.c
@@ -134,7 +134,7 @@ static int timerfd_timer_set_rate(int handle, unsigned int rate)
struct timerfd_timer *our_timer, find_helper = {
.handle = handle,
};
- int res;
+ int res = 0;
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
@@ -146,7 +146,9 @@ static int timerfd_timer_set_rate(int handle, unsigned int rate)
our_timer->saved_timer.it_interval.tv_sec = our_timer->saved_timer.it_value.tv_sec;
our_timer->saved_timer.it_interval.tv_nsec = our_timer->saved_timer.it_value.tv_nsec;
- res = timerfd_settime(handle, 0, &our_timer->saved_timer, NULL);
+ if (!our_timer->is_continuous) {
+ res = timerfd_settime(handle, 0, &our_timer->saved_timer, NULL);
+ }
ao2_ref(our_timer, -1);