diff options
author | Matthew Jordan <mjordan@digium.com> | 2013-03-15 01:24:23 +0000 |
---|---|---|
committer | Matthew Jordan <mjordan@digium.com> | 2013-03-15 01:24:23 +0000 |
commit | d1d66c38781b8d2cc6bad08634696e9f825a28ff (patch) | |
tree | 88dca7343a0a7a6b7860364f9ff7f5b9369554e0 | |
parent | 7a952f1841f6e6de78663d6a66df991d2689a7f6 (diff) |
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
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@383122 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | pbx/pbx_spool.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/pbx/pbx_spool.c b/pbx/pbx_spool.c index 6a47bef87..79ef7166f 100644 --- a/pbx/pbx_spool.c +++ b/pbx/pbx_spool.c @@ -645,9 +645,10 @@ static void *scan_thread(void *unused) 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 @@ static void *scan_thread(void *unused) #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 @@ static void *scan_thread(void *unused) } 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 { |