aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2011-06-29 19:02:19 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2011-06-29 19:02:19 +0000
commit38bf5553aa3910702b16f9e9c23f93b256349c00 (patch)
tree8e53257c08e001ea7c5b06728b3cabec369dfd76 /res
parent68a9aa5cf9e15f37078cf2690da803fabdf63cb2 (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: http://svn.digium.com/svn/asterisk/trunk@325674 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_timing_timerfd.c28
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) {