comparison src/event/modules/ngx_epoll_module.c @ 6635:6acaa638fa07

Events: support for EPOLLEXCLUSIVE. This flag appeared in Linux 4.5 and is useful for avoiding thundering herd problem. The current Linux kernel implementation walks the list of exclusive waiters, and queues an event to each epfd, until it finds the first waiter that has threads blocked on it via epoll_wait().
author Valentin Bartenev <vbart@nginx.com>
date Fri, 15 Jul 2016 15:18:57 +0300
parents 18f6120e3b7a
children 75dbab4ea930
comparison
equal deleted inserted replaced
6634:18f6120e3b7a 6635:6acaa638fa07
25 #define EPOLLWRBAND 0x200 25 #define EPOLLWRBAND 0x200
26 #define EPOLLMSG 0x400 26 #define EPOLLMSG 0x400
27 27
28 #define EPOLLRDHUP 0x2000 28 #define EPOLLRDHUP 0x2000
29 29
30 #define EPOLLEXCLUSIVE 0x10000000
30 #define EPOLLONESHOT 0x40000000 31 #define EPOLLONESHOT 0x40000000
31 #define EPOLLET 0x80000000 32 #define EPOLLET 0x80000000
32 33
33 #define EPOLL_CTL_ADD 1 34 #define EPOLL_CTL_ADD 1
34 #define EPOLL_CTL_DEL 2 35 #define EPOLL_CTL_DEL 2
608 609
609 } else { 610 } else {
610 op = EPOLL_CTL_ADD; 611 op = EPOLL_CTL_ADD;
611 } 612 }
612 613
614 #if (NGX_HAVE_EPOLLEXCLUSIVE && NGX_HAVE_EPOLLRDHUP)
615 if (flags & NGX_EXCLUSIVE_EVENT) {
616 events &= ~EPOLLRDHUP;
617 }
618 #endif
619
613 ee.events = events | (uint32_t) flags; 620 ee.events = events | (uint32_t) flags;
614 ee.data.ptr = (void *) ((uintptr_t) c | ev->instance); 621 ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);
615 622
616 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, 623 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
617 "epoll add event: fd:%d op:%d ev:%08XD", 624 "epoll add event: fd:%d op:%d ev:%08XD",