Merged revisions 294278 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.8

................
  r294278 | jpeeler | 2010-11-08 15:59:45 -0600 (Mon, 08 Nov 2010) | 23 lines
  
  Merged revisions 294277 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.6.2
  
  ........
    r294277 | jpeeler | 2010-11-08 15:58:13 -0600 (Mon, 08 Nov 2010) | 16 lines
    
    Fix playback failure when using IAX with the timerfd module.
    
    To fix this issue the alert pipe will now be used when the timerfd module is
    in use. There appeared to be a race that was not solved by adding locking in the
    timerfd module, but needed to be there anyway. The race was between the timer
    being put in non-continuous mode in ast_read on the channel thread and the IAX 
    frame scheduler queuing a frame which would enable continuous mode before the
    non-continuous mode event was read. This race for now is simply avoided.
    
    (closes issue #18110)
    Reported by: tpanton
    Tested by: tpanton
    
    I put tested by tpanton because it was tested on his hardware. Thanks for the
    remote access to debug this issue!
  ........
................


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@294279 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Jeff Peeler
2010-11-08 22:03:54 +00:00
parent 2df9e23e35
commit 12a40275f2
4 changed files with 27 additions and 1 deletions

View File

@@ -140,6 +140,7 @@ static int timerfd_timer_set_rate(int handle, unsigned int rate)
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
}
ao2_lock(our_timer);
our_timer->saved_timer.it_value.tv_sec = 0;
our_timer->saved_timer.it_value.tv_nsec = rate ? (long) (1000000000 / rate) : 0L;
@@ -150,6 +151,7 @@ static int timerfd_timer_set_rate(int handle, unsigned int rate)
res = timerfd_settime(handle, 0, &our_timer->saved_timer, NULL);
}
ao2_unlock(our_timer);
ao2_ref(our_timer, -1);
return res;
@@ -191,17 +193,20 @@ static int timerfd_timer_enable_continuous(int handle)
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
}
ao2_lock(our_timer);
if (our_timer->is_continuous) {
/*It's already in continous mode, no need to do
* anything further
*/
ao2_unlock(our_timer);
ao2_ref(our_timer, -1);
return 0;
}
res = timerfd_settime(handle, 0, &continuous_timer, &our_timer->saved_timer);
our_timer->is_continuous = 1;
ao2_unlock(our_timer);
ao2_ref(our_timer, -1);
return res;
}
@@ -217,6 +222,7 @@ static int timerfd_timer_disable_continuous(int handle)
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
}
ao2_lock(our_timer);
if(!our_timer->is_continuous) {
/* No reason to do anything if we're not
@@ -229,6 +235,7 @@ static int timerfd_timer_disable_continuous(int handle)
res = timerfd_settime(handle, 0, &our_timer->saved_timer, NULL);
our_timer->is_continuous = 0;
memset(&our_timer->saved_timer, 0, sizeof(our_timer->saved_timer));
ao2_unlock(our_timer);
ao2_ref(our_timer, -1);
return res;
}
@@ -244,6 +251,7 @@ static enum ast_timer_event timerfd_timer_get_event(int handle)
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
}
ao2_lock(our_timer);
if (our_timer->is_continuous) {
res = AST_TIMING_EVENT_CONTINUOUS;
@@ -251,6 +259,7 @@ static enum ast_timer_event timerfd_timer_get_event(int handle)
res = AST_TIMING_EVENT_EXPIRED;
}
ao2_unlock(our_timer);
ao2_ref(our_timer, -1);
return res;
}