if [ $NGX_TEST_BUILD_EPOLL = YES ]; then
have=NGX_HAVE_EPOLL . auto/have
have=NGX_HAVE_EPOLLRDHUP . auto/have
+ have=NGX_HAVE_EPOLLEXCLUSIVE . auto/have
have=NGX_HAVE_EVENTFD . auto/have
have=NGX_TEST_BUILD_EPOLL . auto/have
EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE"
ee.data.ptr = NULL;
epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)"
. auto/feature
+
+
+ # EPOLLEXCLUSIVE appeared in Linux 4.5, glibc 2.24
+
+ ngx_feature="EPOLLEXCLUSIVE"
+ ngx_feature_name="NGX_HAVE_EPOLLEXCLUSIVE"
+ ngx_feature_run=no
+ ngx_feature_incs="#include <sys/epoll.h>"
+ ngx_feature_path=
+ ngx_feature_libs=
+ ngx_feature_test="int efd = 0, fd = 0;
+ struct epoll_event ee;
+ ee.events = EPOLLIN|EPOLLEXCLUSIVE;
+ ee.data.ptr = NULL;
+ epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)"
+ . auto/feature
fi
#define EPOLLRDHUP 0x2000
+#define EPOLLEXCLUSIVE 0x10000000
#define EPOLLONESHOT 0x40000000
#define EPOLLET 0x80000000
op = EPOLL_CTL_ADD;
}
+#if (NGX_HAVE_EPOLLEXCLUSIVE && NGX_HAVE_EPOLLRDHUP)
+ if (flags & NGX_EXCLUSIVE_EVENT) {
+ events &= ~EPOLLRDHUP;
+ }
+#endif
+
ee.events = events | (uint32_t) flags;
ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);
rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept
: ngx_event_recvmsg;
- if (ngx_use_accept_mutex
#if (NGX_HAVE_REUSEPORT)
- && !ls[i].reuseport
+
+ if (ls[i].reuseport) {
+ if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
+ return NGX_ERROR;
+ }
+
+ continue;
+ }
+
#endif
- )
+
+ if (ngx_use_accept_mutex) {
+ continue;
+ }
+
+#if (NGX_HAVE_EPOLLEXCLUSIVE)
+
+ if ((ngx_event_flags & NGX_USE_EPOLL_EVENT)
+ && ccf->worker_processes > 1)
{
+ if (ngx_add_event(rev, NGX_READ_EVENT, NGX_EXCLUSIVE_EVENT)
+ == NGX_ERROR)
+ {
+ return NGX_ERROR;
+ }
+
continue;
}
+#endif
+
if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
return NGX_ERROR;
}
#define NGX_ONESHOT_EVENT EPOLLONESHOT
#endif
+#if (NGX_HAVE_EPOLLEXCLUSIVE)
+#define NGX_EXCLUSIVE_EVENT EPOLLEXCLUSIVE
+#endif
#elif (NGX_HAVE_POLL)
#endif
+#if (NGX_TEST_BUILD_EPOLL)
+#define NGX_EXCLUSIVE_EVENT 0
+#endif
+
+
#ifndef NGX_CLEAR_EVENT
#define NGX_CLEAR_EVENT 0 /* dummy declaration */
#endif