[asterisk-commits] mjordan: branch 1.8 r383120 - /branches/1.8/pbx/pbx_spool.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Mar 14 20:21:59 CDT 2013
Author: mjordan
Date: Thu Mar 14 20:21:55 2013
New Revision: 383120
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=383120
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)
Modified:
branches/1.8/pbx/pbx_spool.c
Modified: branches/1.8/pbx/pbx_spool.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/pbx/pbx_spool.c?view=diff&rev=383120&r1=383119&r2=383120
==============================================================================
--- branches/1.8/pbx/pbx_spool.c (original)
+++ branches/1.8/pbx/pbx_spool.c Thu Mar 14 20:21:55 2013
@@ -628,9 +628,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;
@@ -661,7 +662,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
@@ -733,8 +734,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