diff options
author | David Vossel <dvossel@digium.com> | 2011-06-29 19:02:19 +0000 |
---|---|---|
committer | David Vossel <dvossel@digium.com> | 2011-06-29 19:02:19 +0000 |
commit | 317c631ac1ff2b16d5c927086642b7f75eeec25b (patch) | |
tree | 8e53257c08e001ea7c5b06728b3cabec369dfd76 /res | |
parent | 4240017462ac5077293977cebd35a601775133b9 (diff) |
Merged revisions 325673 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
........
r325673 | dvossel | 2011-06-29 13:59:33 -0500 (Wed, 29 Jun 2011) | 6 lines
Fixes timerfd locking issue.
(closes ASTERISK-17867, ASTERISK-17415)
Patches:
fix uploaded by kobaz
Review: https://reviewboard.asterisk.org/r/1255/
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@325674 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r-- | res/res_timing_timerfd.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/res/res_timing_timerfd.c b/res/res_timing_timerfd.c index ae5d2b411..3e686f810 100644 --- a/res/res_timing_timerfd.c +++ b/res/res_timing_timerfd.c @@ -162,7 +162,35 @@ static void timerfd_timer_ack(int handle, unsigned int quantity) uint64_t expirations; int read_result = 0; + struct timerfd_timer *our_timer, find_helper = { + .handle = handle, + }; + + if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) { + ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle); + return; + } + + if (our_timer->saved_timer.it_value.tv_nsec == 0L) { + ast_log(LOG_DEBUG, "Reading attempt on idle timerfd.\n"); + return; + } + do { + struct itimerspec timer_status; + + if (timerfd_gettime(handle, &timer_status)) { + ast_log(LOG_ERROR, "Call to timerfd_gettime() error: %s\n", strerror(errno)); + expirations = 0; + break; + } + + if ((timer_status.it_value.tv_sec == 0) && (timer_status.it_value.tv_nsec == 0)) { + ast_log(LOG_DEBUG, "Call to timerfd_timer_ack() with disarmed timer - break now.\n"); + expirations = 0; + break; + } + read_result = read(handle, &expirations, sizeof(expirations)); if (read_result == -1) { if (errno == EINTR || errno == EAGAIN) { |