aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/event/modules/ngx_epoll_module.c3
-rw-r--r--src/event/modules/ngx_rtsig_module.c4
-rw-r--r--src/event/ngx_event.h16
-rw-r--r--src/http/ngx_http_request.c15
-rw-r--r--src/os/unix/ngx_readv_chain.c15
-rw-r--r--src/os/unix/ngx_recv.c16
6 files changed, 42 insertions, 27 deletions
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index a1d708475..a8e51c646 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -172,6 +172,7 @@ static int ngx_epoll_init(ngx_cycle_t *cycle)
#else
ngx_event_flags = NGX_USE_LEVEL_EVENT
#endif
+ |NGX_HAVE_GREEDY_EVENT
|NGX_HAVE_INSTANCE_EVENT;
return NGX_OK;
@@ -472,7 +473,7 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle)
continue;
}
-#if (NGX_DEBUG)
+#if (NGX_DEBUG0)
log = c->log ? c->log : cycle->log;
#endif
diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c
index e5f632a2a..af5d77294 100644
--- a/src/event/modules/ngx_rtsig_module.c
+++ b/src/event/modules/ngx_rtsig_module.c
@@ -117,7 +117,9 @@ static int ngx_rtsig_init(ngx_cycle_t *cycle)
ngx_event_actions = ngx_rtsig_module_ctx.actions;
- ngx_event_flags = NGX_USE_SIGIO_EVENT|NGX_HAVE_INSTANCE_EVENT;
+ ngx_event_flags = NGX_USE_SIGIO_EVENT
+ |NGX_HAVE_GREEDY_EVENT
+ |NGX_HAVE_INSTANCE_EVENT;
return NGX_OK;
}
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index f3232e7df..e85f531b7 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -230,32 +230,38 @@ extern ngx_event_actions_t ngx_event_actions;
#define NGX_HAVE_INSTANCE_EVENT 0x00000020
/*
+ * The event filter requires to do i/o operation until EAGAIN -
+ * epoll, rt signals.
+ */
+#define NGX_HAVE_GREEDY_EVENT 0x00000040
+
+/*
* The event filter notifies only the changes (the edges)
* but not an initial level - early epoll patches.
*/
-#define NGX_USE_EDGE_EVENT 0x00000040
+#define NGX_USE_EDGE_EVENT 0x00000080
/*
* No need to add or delete the event filters - rt signals.
*/
-#define NGX_USE_SIGIO_EVENT 0x00000080
+#define NGX_USE_SIGIO_EVENT 0x00000100
/*
* The alternative event method after the rt signals queue overflow.
*/
-#define NGX_OVERFLOW_EVENT 0x00000100
+#define NGX_OVERFLOW_EVENT 0x00000200
/*
* No need to add or delete the event filters - overlapped, aio_read,
* aioread, io_submit.
*/
-#define NGX_USE_AIO_EVENT 0x00000200
+#define NGX_USE_AIO_EVENT 0x00000400
/*
* Need to add socket or handle only once - i/o completion port.
* It also requires HAVE_AIO and NGX_USE_AIO_EVENT to be set.
*/
-#define NGX_USE_IOCP_EVENT 0x00000400
+#define NGX_USE_IOCP_EVENT 0x00000800
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index 1e0362107..d5496e227 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -192,8 +192,8 @@ static void ngx_http_init_request(ngx_event_t *rev)
#endif
len = sizeof(struct sockaddr_in);
if (getsockname(c->fd, (struct sockaddr *) &addr_in, &len) == -1) {
- ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_socket_errno,
- "getsockname() failed");
+ ngx_connection_error(c, ngx_socket_errno,
+ "getsockname() failed");
ngx_http_close_connection(c);
return;
}
@@ -1306,10 +1306,9 @@ static void ngx_http_set_keepalive(ngx_http_request_t *r)
if (c->tcp_nopush == 1) {
if (ngx_tcp_push(c->fd) == NGX_ERROR) {
- ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
- ngx_tcp_push_n " failed");
- ngx_http_close_connection(c);
- return;
+ ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");
+ ngx_http_close_connection(c);
+ return;
}
c->tcp_nopush = 0;
}
@@ -1415,8 +1414,8 @@ static void ngx_http_set_lingering_close(ngx_http_request_t *r)
}
if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {
- ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
- ngx_shutdown_socket_n " failed");
+ ngx_connection_error(c, ngx_socket_errno,
+ ngx_shutdown_socket_n " failed");
ngx_http_close_request(r, 0);
ngx_http_close_connection(c);
return;
diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c
index 49bb3ef3e..86f774a0d 100644
--- a/src/os/unix/ngx_readv_chain.c
+++ b/src/os/unix/ngx_readv_chain.c
@@ -173,13 +173,16 @@ ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
do {
n = readv(c->fd, (struct iovec *) io.elts, io.nelts);
- if (n >= 0) {
- if (n < size) {
- rev->ready = 0;
- }
+ if (n == 0) {
+ rev->ready = 0;
+ rev->eof = 1;
- if (n == 0) {
- rev->eof = 1;
+ return n;
+
+ } else if (n > 0) {
+
+ if (n < size && !(ngx_event_flags & NGX_HAVE_GREEDY_EVENT)) {
+ rev->ready = 0;
}
return n;
diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c
index 63453503c..04b594f6e 100644
--- a/src/os/unix/ngx_recv.c
+++ b/src/os/unix/ngx_recv.c
@@ -126,13 +126,17 @@ ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size)
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
"recv: fd:%d %d of %d", c->fd, n, size);
- if (n >= 0) {
- if ((size_t) n < size) {
- rev->ready = 0;
- }
+ if (n == 0) {
+ rev->ready = 0;
+ rev->eof = 1;
+ return n;
- if (n == 0) {
- rev->eof = 1;
+ } else if (n > 0) {
+
+ if ((size_t) n < size
+ && !(ngx_event_flags & NGX_HAVE_GREEDY_EVENT))
+ {
+ rev->ready = 0;
}
return n;