diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_devpoll_module.c | 25 | ||||
| -rw-r--r-- | src/event/modules/ngx_rtsig_module.c | 10 | ||||
| -rw-r--r-- | src/event/ngx_event.c | 33 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 28 | ||||
| -rw-r--r-- | src/event/ngx_event_openssl.c | 29 | ||||
| -rw-r--r-- | src/event/ngx_event_pipe.c | 63 |
6 files changed, 131 insertions, 57 deletions
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c index 7d6888415..ea1d19b20 100644 --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c @@ -202,13 +202,7 @@ static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) #endif #if (NGX_READ_EVENT != POLLIN) - if (event == NGX_READ_EVENT) { - event = POLLOUT; -#if (NGX_WRITE_EVENT != POLLOUT) - } else { - event = POLLIN; -#endif - } + event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT; #endif #if (NGX_DEBUG) @@ -218,6 +212,7 @@ static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) #endif ev->active = 1; + return ngx_devpoll_set_event(ev, event, 0); } @@ -229,6 +224,10 @@ static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags) c = ev->data; +#if (NGX_READ_EVENT != POLLIN) + event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT; +#endif + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, "devpoll del event: fd:%d ev:%04X", c->fd, event); @@ -242,13 +241,9 @@ static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags) return NGX_OK; } - /* we need to restore the second event if it exists */ - - if (event == NGX_READ_EVENT) { - if (ev->accept) { - return NGX_OK; - } + /* restore the paired event if it exists */ + if (event == POLLIN) { e = c->write; event = POLLOUT; @@ -257,7 +252,7 @@ static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags) event = POLLIN; } - if (e) { + if (e && e->active) { return ngx_devpoll_set_event(e, event, 0); } @@ -273,7 +268,7 @@ static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags) c = ev->data; ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll fd:%d ev:%d fl:%d", c->fd, event, flags); + "devpoll fd:%d ev:%04X fl:%04X", c->fd, event, flags); if (nchanges >= max_changes) { ngx_log_error(NGX_LOG_WARN, ev->log, 0, diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c index 26b2c8140..72c5b7c2d 100644 --- a/src/event/modules/ngx_rtsig_module.c +++ b/src/event/modules/ngx_rtsig_module.c @@ -131,10 +131,6 @@ static ngx_int_t ngx_rtsig_init(ngx_cycle_t *cycle) { ngx_rtsig_conf_t *rtscf; - if (ngx_poll_module_ctx.actions.init(cycle) == NGX_ERROR) { - return NGX_ERROR; - } - rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module); sigemptyset(&set); @@ -170,7 +166,9 @@ static ngx_int_t ngx_rtsig_init(ngx_cycle_t *cycle) static void ngx_rtsig_done(ngx_cycle_t *cycle) { - ngx_poll_module_ctx.actions.done(cycle); + ngx_free(overflow_list); + + overflow_list = NULL; } @@ -697,7 +695,7 @@ static ngx_int_t ngx_rtsig_process_overflow(ngx_cycle_t *cycle) * the new overflow. * * Learn the /proc/sys/kernel/rtsig-max value because - * it can be changed sisnce the last checking. + * it can be changed since the last checking. */ name[0] = CTL_KERN; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 3d7e15cfb..4718dcd20 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -461,6 +461,39 @@ static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle) } +ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat) +{ + int sndlowat; + +#if (HAVE_LOWAT_EVENT) + + if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { + c->write->available = lowat; + return NGX_OK; + } + +#endif + + if (lowat == 0 || c->sndlowat) { + return NGX_OK; + } + + sndlowat = (int) lowat; + + if (setsockopt(c->fd, SOL_SOCKET, SO_SNDLOWAT, + (const void *) &sndlowat, sizeof(int)) == -1) + { + ngx_connection_error(c, ngx_socket_errno, + "setsockopt(SO_SNDLOWAT) failed"); + return NGX_ERROR; + } + + c->sndlowat = 1; + + return NGX_OK; +} + + static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { int m; diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 7237bd4ec..c173adc05 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -207,7 +207,7 @@ typedef struct { ngx_int_t (*add_conn)(ngx_connection_t *c); ngx_int_t (*del_conn)(ngx_connection_t *c, u_int flags); - ngx_int_t (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t try); + ngx_int_t (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait); ngx_int_t (*process_events)(ngx_cycle_t *cycle); ngx_int_t (*init)(ngx_cycle_t *cycle); @@ -479,6 +479,9 @@ int ngx_event_post_acceptex(ngx_listening_t *ls, int n); #endif +ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat); + + /* used in ngx_log_debugX() */ #define ngx_event_ident(p) ((ngx_connection_t *) (p))->fd @@ -497,7 +500,7 @@ ngx_inline static int ngx_handle_read_event(ngx_event_t *rev, u_int flags) { if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - /* kqueue */ + /* kqueue, epoll */ if (!rev->active && !rev->ready) { if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT) @@ -531,7 +534,7 @@ ngx_inline static int ngx_handle_read_event(ngx_event_t *rev, u_int flags) } } - /* aio, iocp, epoll, rtsig */ + /* aio, iocp, rtsig */ return NGX_OK; } @@ -563,14 +566,25 @@ ngx_inline static int ngx_handle_level_read_event(ngx_event_t *rev) } -ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, u_int flags) +ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, size_t lowat) { + ngx_connection_t *c; + + if (lowat) { + c = wev->data; + + if (ngx_send_lowat(c, lowat) == NGX_ERROR) { + return NGX_ERROR; + } + } + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - /* kqueue */ + /* kqueue, epoll */ if (!wev->active && !wev->ready) { - if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT|flags) + if (ngx_add_event(wev, NGX_WRITE_EVENT, + NGX_CLEAR_EVENT | (lowat ? NGX_LOWAT_EVENT : 0)) == NGX_ERROR) { return NGX_ERROR; @@ -602,7 +616,7 @@ ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, u_int flags) } } - /* aio, iocp, epoll, rtsig */ + /* aio, iocp, rtsig */ return NGX_OK; } diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c index 8c48a7afa..151cc429f 100644 --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -72,6 +72,13 @@ ngx_int_t ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) return n; } + if (!SSL_is_init_finished(c->ssl->ssl)) { + handshake = "in SSL handshake"; + + } else { + handshake = ""; + } + sslerr = SSL_get_error(c->ssl->ssl, n); err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; @@ -91,13 +98,6 @@ ngx_int_t ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) #endif } - if (!SSL_is_init_finished(c->ssl->ssl)) { - handshake = "in SSL handshake"; - - } else { - handshake = ""; - } - c->ssl->no_rcv_shut = 1; if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { @@ -240,8 +240,9 @@ ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, static ngx_int_t ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size) { - int n, sslerr; - ngx_err_t err; + int n, sslerr; + ngx_err_t err; + char *handshake; ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %d", size); @@ -265,13 +266,21 @@ static ngx_int_t ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size) } if (sslerr == SSL_ERROR_WANT_READ) { + + if (!SSL_is_init_finished(c->ssl->ssl)) { + handshake = "in SSL handshake"; + + } else { + handshake = ""; + } + ngx_log_error(NGX_LOG_ALERT, c->log, err, "SSL wants to read%s", handshake); return NGX_ERROR; #if 0 return NGX_AGAIN; - } #endif + } c->ssl->no_rcv_shut = 1; diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c index c1982fd40..71fc50050 100644 --- a/src/event/ngx_event_pipe.c +++ b/src/event/ngx_event_pipe.c @@ -64,8 +64,7 @@ ngx_int_t ngx_event_pipe(ngx_event_pipe_t *p, int do_write) if (p->downstream->fd != -1) { wev = p->downstream->write; - wev->available = p->send_lowat; - if (ngx_handle_write_event(wev, NGX_LOWAT_EVENT) == NGX_ERROR) { + if (ngx_handle_write_event(wev, p->send_lowat) == NGX_ERROR) { return NGX_ABORT; } @@ -302,16 +301,41 @@ ngx_int_t ngx_event_pipe_read_upstream(ngx_event_pipe_t *p) ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, "pipe buf"); } - for (cl = p->in; cl; cl = cl->next) { + for (cl = p->busy; cl; cl = cl->next) { ngx_log_debug3(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf in " PTR_FMT ", pos " PTR_FMT ", size: %d", + "pipe buf busy " PTR_FMT ", pos " PTR_FMT ", size: %d", cl->buf->start, cl->buf->pos, cl->buf->last - cl->buf->pos); } - for (cl = p->busy; cl; cl = cl->next) { + for (cl = p->out; cl; cl = cl->next) { + if (cl->buf->in_file && cl->buf->temporary) { + ngx_log_debug5(NGX_LOG_DEBUG_EVENT, p->log, 0, + "pipe buf out shadow " + PTR_FMT ", pos " PTR_FMT ", size: %d " + "file: " OFF_T_FMT ", size: %d", + cl->buf->start, cl->buf->pos, + cl->buf->last - cl->buf->pos, + cl->buf->file_pos, + cl->buf->file_last - cl->buf->file_pos); + + } else if (cl->buf->in_file) { + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, + "pipe buf out file " OFF_T_FMT ", size: %d", + cl->buf->file_pos, + cl->buf->file_last - cl->buf->file_pos); + } else { + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, p->log, 0, + "pipe buf out " PTR_FMT ", pos " PTR_FMT + ", size: %d", + cl->buf->start, cl->buf->pos, + cl->buf->last - cl->buf->pos); + } + } + + for (cl = p->in; cl; cl = cl->next) { ngx_log_debug3(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf busy " PTR_FMT ", pos " PTR_FMT ", size: %d", + "pipe buf in " PTR_FMT ", pos " PTR_FMT ", size: %d", cl->buf->start, cl->buf->pos, cl->buf->last - cl->buf->pos); } @@ -337,7 +361,9 @@ ngx_int_t ngx_event_pipe_read_upstream(ngx_event_pipe_t *p) if (p->free_bufs) { for (cl = p->free_raw_bufs; cl; cl = cl->next) { - ngx_pfree(p->pool, cl->buf->start); + if (cl->buf->shadow == NULL) { + ngx_pfree(p->pool, cl->buf->start); + } } } } @@ -597,8 +623,11 @@ static ngx_int_t ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p) ngx_chain_add_link(p->out, p->last_out, cl); if (b->last_shadow) { - b->shadow->last = b->shadow->pos = b->shadow->start; + b->shadow->pos = b->shadow->start; + b->shadow->last = b->shadow->start; + ngx_alloc_link_and_set_buf(tl, b->shadow, p->pool, NGX_ABORT); + *last_free = tl; last_free = &tl->next; } @@ -650,28 +679,24 @@ ngx_inline static void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf) { ngx_buf_t *b, *next; - if (buf->shadow == NULL) { + b = buf->shadow; + + if (b == NULL) { return; } - b = buf->shadow; - while (!b->last_shadow) { next = b->shadow; - b->in_file = 0; - b->temp_file = 0; - b->flush = 0; - b->zerocopy_busy = 0; + b->temporary = 0; + b->recycled = 0; b->shadow = NULL; b = next; } - b->in_file = 0; - b->temp_file = 0; - b->flush = 0; - b->zerocopy_busy = 0; + b->temporary = 0; + b->recycled = 0; b->last_shadow = 0; b->shadow = NULL; |
