summaryrefslogtreecommitdiffhomepage
path: root/src/event/modules
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2013-07-12 14:51:07 +0400
committerValentin Bartenev <vbart@nginx.com>2013-07-12 14:51:07 +0400
commit182a05b9d5b4321be89aa25ade89e41d00f0b4f7 (patch)
tree6732cf547663b6f5d0ac6154a27876fc3771ca91 /src/event/modules
parent0f0502064dda4e702b4f379ee2af4bbddcb93214 (diff)
downloadnginx-182a05b9d5b4321be89aa25ade89e41d00f0b4f7.tar.gz
nginx-182a05b9d5b4321be89aa25ade89e41d00f0b4f7.tar.bz2
Events: support for EPOLLRDHUP (ticket #320).
Since Linux 2.6.17, epoll is able to report about peer half-closed connection using special EPOLLRDHUP flag on a read event.
Diffstat (limited to 'src/event/modules')
-rw-r--r--src/event/modules/ngx_epoll_module.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index ee77d8e4a..f5f663179 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -25,6 +25,8 @@
#define EPOLLERR 0x008
#define EPOLLHUP 0x010
+#define EPOLLRDHUP 0x2000
+
#define EPOLLET 0x80000000
#define EPOLLONESHOT 0x40000000
@@ -396,13 +398,13 @@ ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
if (event == NGX_READ_EVENT) {
e = c->write;
prev = EPOLLOUT;
-#if (NGX_READ_EVENT != EPOLLIN)
- events = EPOLLIN;
+#if (NGX_READ_EVENT != EPOLLIN|EPOLLRDHUP)
+ events = EPOLLIN|EPOLLRDHUP;
#endif
} else {
e = c->read;
- prev = EPOLLIN;
+ prev = EPOLLIN|EPOLLRDHUP;
#if (NGX_WRITE_EVENT != EPOLLOUT)
events = EPOLLOUT;
#endif
@@ -466,7 +468,7 @@ ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
} else {
e = c->read;
- prev = EPOLLIN;
+ prev = EPOLLIN|EPOLLRDHUP;
}
if (e->active) {
@@ -501,7 +503,7 @@ ngx_epoll_add_connection(ngx_connection_t *c)
{
struct epoll_event ee;
- ee.events = EPOLLIN|EPOLLOUT|EPOLLET;
+ ee.events = EPOLLIN|EPOLLOUT|EPOLLET|EPOLLRDHUP;
ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance);
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
@@ -666,6 +668,12 @@ ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
if ((revents & EPOLLIN) && rev->active) {
+#if (NGX_HAVE_EPOLLRDHUP)
+ if (revents & EPOLLRDHUP) {
+ rev->pending_eof = 1;
+ }
+#endif
+
if ((flags & NGX_POST_THREAD_EVENTS) && !rev->accept) {
rev->posted_ready = 1;