[asterisk-commits] dvossel: branch 1.8 r325673 - /branches/1.8/res/res_timing_timerfd.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jun 29 13:59:36 CDT 2011


Author: dvossel
Date: Wed Jun 29 13:59:33 2011
New Revision: 325673

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=325673
Log:
Fixes timerfd locking issue.

(closes ASTERISK-17867, ASTERISK-17415)
Patches:
     fix uploaded by kobaz

Modified:
    branches/1.8/res/res_timing_timerfd.c

Modified: branches/1.8/res/res_timing_timerfd.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/res/res_timing_timerfd.c?view=diff&rev=325673&r1=325672&r2=325673
==============================================================================
--- branches/1.8/res/res_timing_timerfd.c (original)
+++ branches/1.8/res/res_timing_timerfd.c Wed Jun 29 13:59:33 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