diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2005-09-23 11:02:22 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2005-09-23 11:02:22 +0000 |
| commit | 31eb8c015d58a5b36b9578d4ee6c217e16cb776f (patch) | |
| tree | 28ebccc10deba4132e05414aac1874d5013fdf58 /src/event/ngx_event_acceptex.c | |
| parent | f44a1f5f579e19441db2d477a7c81d8894ba2262 (diff) | |
| download | nginx-release-0.2.0.tar.gz nginx-release-0.2.0.tar.bz2 | |
nginx-0.2.0-RELEASE importrelease-0.2.0
*) The pid-file names used during online upgrade was changed and now is
not required a manual rename operation. The old master process adds
the ".oldbin" suffix to its pid-file and executes a new binary file.
The new master process creates usual pid-file without the ".newbin"
suffix. If the master process exits, then old master process renames
back its pid-file with the ".oldbin" suffix to the pid-file without
suffix.
*) Change: the "worker_connections" directive, new name of the
"connections" directive; now the directive specifies maximum number
of connections, but not maximum socket descriptor number.
*) Feature: SSL supports the session cache inside one worker process.
*) Feature: the "satisfy_any" directive.
*) Change: the ngx_http_access_module and ngx_http_auth_basic_module do
not run for subrequests.
*) Feature: the "worker_rlimit_nofile" and "worker_rlimit_sigpending"
directives.
*) Bugfix: if all backend using in load-balancing failed after one
error, then nginx did not try do connect to them during 60 seconds.
*) Bugfix: in IMAP/POP3 command argument parsing.
Thanks to Rob Mueller.
*) Bugfix: errors while using SSL in IMAP/POP3 proxy.
*) Bugfix: errors while using SSI and gzipping.
*) Bugfix: the "Expires" and "Cache-Control" header lines were omitted
from the 304 responses.
Thanks to Alexandr Kukushkin.
Diffstat (limited to '')
| -rw-r--r-- | src/event/ngx_event_acceptex.c | 155 |
1 files changed, 96 insertions, 59 deletions
diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c index bc2443dfd..961971424 100644 --- a/src/event/ngx_event_acceptex.c +++ b/src/event/ngx_event_acceptex.c @@ -9,12 +9,18 @@ #include <ngx_event.h> -void ngx_event_acceptex(ngx_event_t *rev) +static void ngx_close_posted_connection(ngx_connection_t *c); + + +void +ngx_event_acceptex(ngx_event_t *rev) { ngx_connection_t *c; c = rev->data; + c->log->handler = ngx_accept_log_error; + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd); if (rev->ovlp.error) { @@ -78,11 +84,13 @@ void ngx_event_acceptex(ngx_event_t *rev) } -int ngx_event_post_acceptex(ngx_listening_t *ls, int n) +ngx_int_t +ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n) { u_long rcvd; - ngx_int_t i; ngx_err_t err; + ngx_log_t *log; + ngx_uint_t i; ngx_event_t *rev, *wev; ngx_socket_t s; ngx_connection_t *c; @@ -93,99 +101,99 @@ int ngx_event_post_acceptex(ngx_listening_t *ls, int n) s = ngx_socket(ls->family, ls->type, 0); - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ls->log, 0, + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &ls->log, 0, ngx_socket_n " s:%d", s); if (s == -1) { - ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, - ngx_socket_n " for AcceptEx() %s post failed", - ls->addr_text.data); + ngx_log_error(NGX_LOG_ALERT, &ls->log, ngx_socket_errno, + ngx_socket_n " failed"); return NGX_ERROR; } - /* - * Winsock assignes a socket number divisible by 4 - * so to find a connection we divide a socket number by 4. - */ + c = ngx_get_connection(s, &ls->log); - if (s % 4) { - ngx_log_error(NGX_LOG_EMERG, ls->log, 0, - ngx_socket_n - " created socket %d, not divisible by 4", s); - - exit(1); + if (c == NULL) { + return NGX_ERROR; } - c = &ngx_cycle->connections[s / 4]; - rev = &ngx_cycle->read_events[s / 4]; - wev = &ngx_cycle->write_events[s / 4]; + rev = c->read; + wev = c->write; ngx_memzero(c, sizeof(ngx_connection_t)); - ngx_memzero(rev, sizeof(ngx_event_t)); - ngx_memzero(wev, sizeof(ngx_event_t)); - - c->listening = ls; - - rev->index = NGX_INVALID_INDEX; - wev->index = NGX_INVALID_INDEX; - - rev->ovlp.event = rev; - wev->ovlp.event = wev; - rev->handler = ngx_event_acceptex; - - rev->data = c; - wev->data = c; c->read = rev; c->write = wev; - c->fd = s; - c->unexpected_eof = 1; - - rev->ready = 1; - wev->write = 1; - wev->ready = 1; - - c->ctx = ls->ctx; - c->servers = ls->servers; - - c->recv = ngx_recv; - c->send = ngx_send; - c->send_chain = ngx_send_chain; + c->log = &ls->log; - c->pool = ngx_create_pool(ls->pool_size, ls->log); + c->pool = ngx_create_pool(ls->pool_size, &ls->log); if (c->pool == NULL) { + ngx_close_posted_connection(c); + return NGX_ERROR; + } + + log = ngx_palloc(c->pool, sizeof(ngx_log_t)); + if (log == NULL) { + ngx_close_posted_connection(c); return NGX_ERROR; } - c->buffer = ngx_create_temp_buf(c->pool, - ls->post_accept_buffer_size - + 2 * (c->listening->socklen + 16)); + c->buffer = ngx_create_temp_buf(c->pool, ls->post_accept_buffer_size + + 2 * (ls->socklen + 16)); if (c->buffer == NULL) { + ngx_close_posted_connection(c); return NGX_ERROR; } c->local_sockaddr = ngx_palloc(c->pool, ls->socklen); if (c->local_sockaddr == NULL) { + ngx_close_posted_connection(c); return NGX_ERROR; } c->sockaddr = ngx_palloc(c->pool, ls->socklen); if (c->sockaddr == NULL) { + ngx_close_posted_connection(c); return NGX_ERROR; } - c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)); - if (c->log == NULL) { - return NGX_ERROR; - } + *log = ls->log; + c->log = log; - ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); - c->read->log = c->log; - c->write->log = c->log; + c->recv = ngx_recv; + c->send = ngx_send; + c->send_chain = ngx_send_chain; + + c->unexpected_eof = 1; + + c->ctx = ls->ctx; + c->servers = ls->servers; + + c->listening = ls; + + ngx_memzero(rev, sizeof(ngx_event_t)); + ngx_memzero(wev, sizeof(ngx_event_t)); + + rev->data = c; + wev->data = c; + + rev->index = NGX_INVALID_INDEX; + wev->index = NGX_INVALID_INDEX; + + rev->ovlp.event = rev; + wev->ovlp.event = wev; + rev->handler = ngx_event_acceptex; + + rev->ready = 1; + wev->write = 1; + wev->ready = 1; + + rev->log = c->log; + wev->log = c->log; if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { + ngx_close_posted_connection(c); return NGX_ERROR; } @@ -196,9 +204,10 @@ int ngx_event_post_acceptex(ngx_listening_t *ls, int n) err = ngx_socket_errno; if (err != WSA_IO_PENDING) { - ngx_log_error(NGX_LOG_ALERT, ls->log, err, + ngx_log_error(NGX_LOG_ALERT, &ls->log, err, "AcceptEx() %s falied", ls->addr_text.data); + ngx_close_posted_connection(c); return NGX_ERROR; } } @@ -206,3 +215,31 @@ int ngx_event_post_acceptex(ngx_listening_t *ls, int n) return NGX_OK; } + + +static void +ngx_close_posted_connection(ngx_connection_t *c) +{ + ngx_socket_t fd; + + ngx_free_connection(c); + + fd = c->fd; + c->fd = (ngx_socket_t) -1; + + if (ngx_close_socket(fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno, + ngx_close_socket_n " failed"); + } + + if (c->pool) { + ngx_destroy_pool(c->pool); + } +} + + +u_char * +ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len) +{ + return ngx_snprintf(buf, len, " while posting AcceptEx() on %V", log->data); +} |
