[asterisk-commits] russell: branch group/timing r122925 - /team/group/timing/res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jun 16 07:58:16 CDT 2008


Author: russell
Date: Mon Jun 16 07:58:15 2008
New Revision: 122925

URL: http://svn.digium.com/view/asterisk?view=rev&rev=122925
Log:
- Try a little bit harder to ensure we wake up every 10 ms
- make the timing thread go to sleep when no timers are open

Modified:
    team/group/timing/res/res_timing_pthread.c

Modified: team/group/timing/res/res_timing_pthread.c
URL: http://svn.digium.com/view/asterisk/team/group/timing/res/res_timing_pthread.c?view=diff&rev=122925&r1=122924&r2=122925
==============================================================================
--- team/group/timing/res/res_timing_pthread.c (original)
+++ team/group/timing/res/res_timing_pthread.c Mon Jun 16 07:58:15 2008
@@ -92,6 +92,16 @@
 static void write_byte(int wr_fd);
 static void read_pipe(int rd_fd, unsigned int num, int clear);
 
+/*!
+ * \brief Data for the timing thread
+ */
+static struct {
+	pthread_t thread;
+	ast_mutex_t lock;
+	ast_cond_t cond;
+	unsigned int stop:1;
+} timing_thread;
+
 static int pthread_timer_open(void)
 {
 	struct pthread_timer *timer;
@@ -109,7 +119,14 @@
 		return -1;
 	}
 
+	ao2_lock(pthread_timers);
+	if (!ao2_container_count(pthread_timers)) {
+		ast_mutex_lock(&timing_thread.lock);
+		ast_cond_signal(&timing_thread.cond);
+		ast_mutex_unlock(&timing_thread.lock);
+	}
 	ao2_link(pthread_timers, timer);
+	ao2_unlock(pthread_timers);
 
 	return timer->pipe[PIPE_READ];
 }
@@ -390,32 +407,27 @@
 	return 0;
 }
 
-/*!
- * \brief Data for the timing thread
- */
-static struct {
-	pthread_t thread;
-	ast_mutex_t lock;
-	ast_cond_t cond;
-	unsigned int stop:1;
-} timing_thread;
-
 static void *do_timing(void *arg)
 {
+	struct timeval next_wakeup = ast_tvnow();
+
 	while (!timing_thread.stop) {
-		struct timeval next_wakeup;
 		struct timespec ts = { 0, };
 
 		ao2_callback(pthread_timers, 0, run_timer, NULL);
 
-		next_wakeup = ast_tvadd(ast_tvnow(), ast_tv(0, 10000));
+		next_wakeup = ast_tvadd(next_wakeup, ast_tv(0, 10000));
 
 		ts.tv_sec = next_wakeup.tv_sec;
 		ts.tv_nsec = next_wakeup.tv_usec * 1000;
 
 		ast_mutex_lock(&timing_thread.lock);
 		if (!timing_thread.stop) {
-			ast_cond_timedwait(&timing_thread.cond, &timing_thread.lock, &ts);
+			if (ao2_container_count(pthread_timers)) {
+				ast_cond_timedwait(&timing_thread.cond, &timing_thread.lock, &ts);
+			} else {
+				ast_cond_wait(&timing_thread.cond, &timing_thread.lock);
+			}
 		}
 		ast_mutex_unlock(&timing_thread.lock);
 	}




More information about the asterisk-commits mailing list