[asterisk-commits] jpeeler: branch 1.8 r294278 - in /branches/1.8: ./ include/asterisk/ main/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Nov 8 16:00:00 CST 2010


Author: jpeeler
Date: Mon Nov  8 15:59:45 2010
New Revision: 294278

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=294278
Log:
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!
........

Modified:
    branches/1.8/   (props changed)
    branches/1.8/include/asterisk/timing.h
    branches/1.8/main/channel.c
    branches/1.8/main/timing.c
    branches/1.8/res/res_timing_timerfd.c

Propchange: branches/1.8/
------------------------------------------------------------------------------
Binary property 'branch-1.6.2-merged' - no diff available.

Modified: branches/1.8/include/asterisk/timing.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/include/asterisk/timing.h?view=diff&rev=294278&r1=294277&r2=294278
==============================================================================
--- branches/1.8/include/asterisk/timing.h (original)
+++ branches/1.8/include/asterisk/timing.h Mon Nov  8 15:59:45 2010
@@ -216,6 +216,16 @@
  */
 unsigned int ast_timer_get_max_rate(const struct ast_timer *handle);
 
+/*!
+ * \brief Get name of timer in use
+ *
+ * \param handle timer handle returned by timer_open()
+ *
+ * \return name of timer
+ * \since 1.6.2
+ */
+const char *ast_timer_get_name(const struct ast_timer *handle);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif

Modified: branches/1.8/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/channel.c?view=diff&rev=294278&r1=294277&r2=294278
==============================================================================
--- branches/1.8/main/channel.c (original)
+++ branches/1.8/main/channel.c Mon Nov  8 15:59:45 2010
@@ -1129,7 +1129,9 @@
 	}
 
 	if ((tmp->timer = ast_timer_open())) {
-		needqueue = 0;
+		if (strcmp(ast_timer_get_name(tmp->timer), "timerfd")) {
+			needqueue = 0;
+		}
 		tmp->timingfd = ast_timer_fd(tmp->timer);
 	}
 

Modified: branches/1.8/main/timing.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/timing.c?view=diff&rev=294278&r1=294277&r2=294278
==============================================================================
--- branches/1.8/main/timing.c (original)
+++ branches/1.8/main/timing.c Mon Nov  8 15:59:45 2010
@@ -205,6 +205,11 @@
 	return res;
 }
 
+const char *ast_timer_get_name(const struct ast_timer *handle)
+{
+	return handle->holder->iface->name;
+}
+
 static char *timing_test(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
 	struct ast_timer *timer;

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=294278&r1=294277&r2=294278
==============================================================================
--- branches/1.8/res/res_timing_timerfd.c (original)
+++ branches/1.8/res/res_timing_timerfd.c Mon Nov  8 15:59:45 2010
@@ -140,6 +140,7 @@
 		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 @@
 		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 @@
 		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 @@
 		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 @@
 	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 @@
 		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 @@
 		res = AST_TIMING_EVENT_EXPIRED;
 	}
 
+	ao2_unlock(our_timer);
 	ao2_ref(our_timer, -1);
 	return res;
 }




More information about the asterisk-commits mailing list