diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/event/modules/ngx_epoll_module.c | 3 | ||||
-rw-r--r-- | src/event/modules/ngx_rtsig_module.c | 4 | ||||
-rw-r--r-- | src/event/ngx_event.h | 16 | ||||
-rw-r--r-- | src/http/ngx_http_request.c | 15 | ||||
-rw-r--r-- | src/os/unix/ngx_readv_chain.c | 15 | ||||
-rw-r--r-- | src/os/unix/ngx_recv.c | 16 |
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; |