[asterisk-commits] dvossel: trunk r325674 - in /trunk: ./ res/res_timing_timerfd.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Jun 29 14:02:22 CDT 2011
Author: dvossel
Date: Wed Jun 29 14:02:19 2011
New Revision: 325674
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=325674
Log:
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
........
Modified:
trunk/ (props changed)
trunk/res/res_timing_timerfd.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: trunk/res/res_timing_timerfd.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_timing_timerfd.c?view=diff&rev=325674&r1=325673&r2=325674
==============================================================================
--- trunk/res/res_timing_timerfd.c (original)
+++ trunk/res/res_timing_timerfd.c Wed Jun 29 14:02:19 2011
@@ -162,7 +162,35 @@
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) {
More information about the asterisk-commits
mailing list