]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fixes timerfd locking issue.
authorDavid Vossel <dvossel@digium.com>
Wed, 29 Jun 2011 18:59:33 +0000 (18:59 +0000)
committerDavid Vossel <dvossel@digium.com>
Wed, 29 Jun 2011 18:59:33 +0000 (18:59 +0000)
(closes ASTERISK-17867, ASTERISK-17415)
Patches:
     fix uploaded by kobaz
https://reviewboard.asterisk.org/r/1255/

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@325673 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_timing_timerfd.c

index ae5d2b411e51ef5aca67a41d3e06a4bc4bde7578..3e686f81054a4e6f8f73180e19aabdff0998b82e 100644 (file)
@@ -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) {