[asterisk-commits] mjordan: trunk r383122 - in /trunk: ./ pbx/pbx_spool.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Mar 14 20:24:26 CDT 2013


Author: mjordan
Date: Thu Mar 14 20:24:23 2013
New Revision: 383122

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=383122
Log:
Fix processing of call files when using KQueue on OS X

In certain situations, call files are not processed when using KQueue with
pbx_spool. Asterisk was sending an invalid timeout value when the spool
directory is empty, causing the call to kevent to error immediately. This
can create a tight loop, increasing the CPU load on the system.

(closes issue ASTERISK-21176)
Reported by: Carlton O'Riley
patches:
  kqueue_osx.patch uploaded by coriley (License 6473)
........

Merged revisions 383120 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 383121 from http://svn.asterisk.org/svn/asterisk/branches/11

Modified:
    trunk/   (props changed)
    trunk/pbx/pbx_spool.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.

Modified: trunk/pbx/pbx_spool.c
URL: http://svnview.digium.com/svn/asterisk/trunk/pbx/pbx_spool.c?view=diff&rev=383122&r1=383121&r2=383122
==============================================================================
--- trunk/pbx/pbx_spool.c (original)
+++ trunk/pbx/pbx_spool.c Thu Mar 14 20:24:23 2013
@@ -645,9 +645,10 @@
 	char buf[8192] __attribute__((aligned (sizeof(int))));
 	struct pollfd pfd = { .fd = inotify_fd, .events = POLLIN };
 #else
-	struct timespec nowait = { 0, 1 };
+	struct timespec nowait = { .tv_sec = 0, .tv_nsec = 1 };
 	int inotify_fd = kqueue();
 	struct kevent kev;
+	struct kevent event;
 #endif
 	struct direntry *cur;
 
@@ -678,7 +679,7 @@
 
 #ifndef HAVE_INOTIFY
 	EV_SET(&kev, dirfd(dir), EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_WRITE, 0, NULL);
-	if (kevent(inotify_fd, &kev, 1, NULL, 0, &nowait) < 0 && errno != 0) {
+	if (kevent(inotify_fd, &kev, 1, &event, 1, &nowait) < 0 && errno != 0) {
 		ast_log(LOG_ERROR, "Unable to watch directory %s: %s\n", qdir, strerror(errno));
 	}
 #endif
@@ -750,8 +751,18 @@
 		}
 		queue_created_files();
 #else
-			struct timespec ts2 = { next - now, 0 };
-			if (kevent(inotify_fd, NULL, 0, &kev, 1, &ts2) <= 0) {
+			int num_events;
+			/* If queue empty then wait forever */
+			if (next == INT_MAX) {
+				num_events = kevent(inotify_fd, &kev, 1, &event, 1, NULL);
+			} else {
+				struct timespec ts2 = { .tv_sec = (unsigned long int)(next - now), .tv_nsec = 0 };
+				num_events = kevent(inotify_fd, &kev, 1, &event, 1, &ts2);
+			}
+			if ((num_events < 0) || (event.flags == EV_ERROR)) {
+				ast_debug(10, "KEvent error %s\n", strerror(errno));
+				continue;
+			} else if (num_events == 0) {
 				/* Interrupt or timeout, restart calculations */
 				continue;
 			} else {




More information about the asterisk-commits mailing list