|  | 
 | # Copyright (C) Igor Sysoev | 
 | # Copyright (C) Nginx, Inc. | 
 |  | 
 |  | 
 | have=NGX_DARWIN . auto/have_headers | 
 |  | 
 | CORE_INCS="$UNIX_INCS" | 
 | CORE_DEPS="$UNIX_DEPS $DARWIN_DEPS" | 
 | CORE_SRCS="$UNIX_SRCS $DARWIN_SRCS" | 
 |  | 
 |  | 
 |  | 
 | ngx_spacer=' | 
 | ' | 
 |  | 
 | # kqueue | 
 |  | 
 | echo " + kqueue found" | 
 | have=NGX_HAVE_KQUEUE . auto/have | 
 | have=NGX_HAVE_CLEAR_EVENT . auto/have | 
 | EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE" | 
 | CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS" | 
 | EVENT_FOUND=YES | 
 | NGX_KQUEUE_CHECKED=YES | 
 |  | 
 | ngx_feature="kqueue's EVFILT_TIMER" | 
 | ngx_feature_name="NGX_HAVE_TIMER_EVENT" | 
 | ngx_feature_run=yes | 
 | ngx_feature_incs="#include <sys/event.h> | 
 |                   #include <sys/time.h>" | 
 | ngx_feature_path= | 
 | ngx_feature_libs= | 
 | ngx_feature_test="int      kq; | 
 |                   struct kevent    kev; | 
 |                   struct timespec  ts; | 
 |  | 
 |                   if ((kq = kqueue()) == -1) return 1; | 
 |  | 
 |                   kev.ident = 0; | 
 |                   kev.filter = EVFILT_TIMER; | 
 |                   kev.flags = EV_ADD|EV_ENABLE; | 
 |                   kev.fflags = 0; | 
 |                   kev.data = 1000; | 
 |                   kev.udata = 0; | 
 |  | 
 |                   ts.tv_sec = 0; | 
 |                   ts.tv_nsec = 0; | 
 |  | 
 |                   if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1; | 
 |  | 
 |                   if (kev.flags & EV_ERROR) return 1;" | 
 |  | 
 | . auto/feature | 
 |  | 
 |  | 
 | ngx_feature="Darwin 64-bit kqueue millisecond timeout bug" | 
 | ngx_feature_name=NGX_DARWIN_KEVENT_BUG | 
 | ngx_feature_run=bug | 
 | ngx_feature_incs="#include <sys/event.h> | 
 |                   #include <sys/time.h>" | 
 | ngx_feature_path= | 
 | ngx_feature_libs= | 
 | ngx_feature_test="int  kq; | 
 |                   struct kevent    kev; | 
 |                   struct timespec  ts; | 
 |                   struct timeval   tv, tv0; | 
 |  | 
 |                   kq = kqueue(); | 
 |  | 
 |                   ts.tv_sec = 0; | 
 |                   ts.tv_nsec = 999000000; | 
 |  | 
 |                   gettimeofday(&tv, 0); | 
 |                   kevent(kq, NULL, 0, &kev, 1, &ts); | 
 |                   gettimeofday(&tv0, 0); | 
 |                   timersub(&tv0, &tv, &tv); | 
 |  | 
 |                   if (tv.tv_sec * 1000000 + tv.tv_usec < 900000) return 1;" | 
 |  | 
 | . auto/feature | 
 |  | 
 |  | 
 | # sendfile() | 
 |  | 
 | CC_AUX_FLAGS="$CC_AUX_FLAGS" | 
 | ngx_feature="sendfile()" | 
 | ngx_feature_name="NGX_HAVE_SENDFILE" | 
 | ngx_feature_run=yes | 
 | ngx_feature_incs="#include <sys/types.h> | 
 |                   #include <sys/socket.h> | 
 |                   #include <sys/uio.h> | 
 |                   #include <sys/errno.h>" | 
 | ngx_feature_path= | 
 | ngx_feature_libs= | 
 | ngx_feature_test="int s = 0, fd = 1; | 
 |                   off_t n; off_t off = 0; | 
 |                   n = sendfile(s, fd, off, &n, NULL, 0); | 
 |                   if (n == -1 && errno == ENOSYS) return 1" | 
 | . auto/feature | 
 |  | 
 | if [ $ngx_found = yes ]; then | 
 |     have=NGX_HAVE_SENDFILE . auto/have | 
 |     CORE_SRCS="$CORE_SRCS $DARWIN_SENDFILE_SRCS" | 
 | fi | 
 |  | 
 |  | 
 | ngx_feature="atomic(3)" | 
 | ngx_feature_name=NGX_DARWIN_ATOMIC | 
 | ngx_feature_run=no | 
 | ngx_feature_incs="#include <libkern/OSAtomic.h>" | 
 | ngx_feature_path= | 
 | ngx_feature_libs= | 
 | ngx_feature_test="int32_t  lock, n; | 
 |                   n = OSAtomicCompareAndSwap32Barrier(0, 1, &lock)" | 
 | . auto/feature |