Mercurial > hg > nginx-vendor-current
view src/event/modules/ngx_aio_module.c @ 366:babd3d9efb62 NGINX_0_6_27
nginx 0.6.27
*) Change: now by default the rtsig method is not built on
Linux 2.6.18+.
*) Change: now a request method is not changed while redirection to a
named location via an "error_page" directive.
*) Feature: the "resolver" and "resolver_timeout" directives in SMTP
proxy.
*) Feature: the "post_action" directive supports named locations.
*) Bugfix: a segmentation fault occurred in worker process, if a
request was redirected from proxy, FastCGI, or memcached location to
static named locations.
*) Bugfix: browsers did not repeat SSL handshake if there is no valid
client certificate in first handshake.
Thanks to Alexander V. Inyukhin.
*) Bugfix: if response code 495-497 was redirected via an "error_page"
directive without code change, then nginx tried to allocate too many
memory.
*) Bugfix: memory leak in long-lived non buffered connections.
*) Bugfix: memory leak in resolver.
*) Bugfix: a segmentation fault occurred in worker process, if a
request was redirected from proxy, FastCGI, or memcached location to
static named locations.
*) Bugfix: in the $proxy_host and $proxy_port variables caching.
Thanks to Sergey Bochenkov.
*) Bugfix: a "proxy_pass" directive with variables used incorrectly the
same port as in another "proxy_pass" directive with the same host
name and without variables.
Thanks to Sergey Bochenkov.
*) Bugfix: an alert "sendmsg() failed (9: Bad file descriptor)" on some
64-bit platforms while reconfiguration.
*) Bugfix: a segmentation fault occurred in worker process, if empty
stub block was used second time in SSI.
*) Bugfix: in copying URI part contained escaped symbols into arguments.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 12 Mar 2008 00:00:00 +0300 |
parents | 583decdb82a4 |
children | 98143f74eb3d |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> #include <ngx_aio.h> #if (NGX_HAVE_KQUEUE) #include <ngx_kqueue_module.h> #endif static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_aio_done(ngx_cycle_t *cycle); static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags); static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); ngx_os_io_t ngx_os_aio = { ngx_aio_read, ngx_aio_read_chain, NULL, ngx_aio_write, ngx_aio_write_chain, 0 }; static ngx_str_t aio_name = ngx_string("aio"); ngx_event_module_t ngx_aio_module_ctx = { &aio_name, NULL, /* create configuration */ NULL, /* init configuration */ { ngx_aio_add_event, /* add an event */ ngx_aio_del_event, /* delete an event */ NULL, /* enable an event */ NULL, /* disable an event */ NULL, /* add an connection */ ngx_aio_del_connection, /* delete an connection */ NULL, /* process the changes */ ngx_aio_process_events, /* process the events */ ngx_aio_init, /* init the events */ ngx_aio_done /* done the events */ } }; ngx_module_t ngx_aio_module = { NGX_MODULE_V1, &ngx_aio_module_ctx, /* module context */ NULL, /* module directives */ NGX_EVENT_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING }; #if (NGX_HAVE_KQUEUE) static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer) { if (ngx_kqueue_module_ctx.actions.init(cycle, timer) == NGX_ERROR) { return NGX_ERROR; } ngx_io = ngx_os_aio; ngx_event_flags = NGX_USE_AIO_EVENT; ngx_event_actions = ngx_aio_module_ctx.actions; return NGX_OK; } static void ngx_aio_done(ngx_cycle_t *cycle) { ngx_kqueue_module_ctx.actions.done(cycle); } /* the event adding and deleting are needed for the listening sockets */ static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { return ngx_kqueue_module_ctx.actions.add(ev, event, flags); } static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { return ngx_kqueue_module_ctx.actions.del(ev, event, flags); } static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags) { int rc; if (c->read->active == 0 && c->write->active == 0) { return NGX_OK; } if (flags & NGX_CLOSE_EVENT) { return NGX_OK; } rc = aio_cancel(c->fd, NULL); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_cancel: %d", rc); if (rc == AIO_CANCELED) { c->read->active = c->write->active = 0; return NGX_OK; } if (rc == AIO_ALLDONE) { c->read->active = c->write->active = 0; ngx_log_error(NGX_LOG_ALERT, c->log, 0, "aio_cancel() returned AIO_ALLDONE"); return NGX_OK; } if (rc == -1) { ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_cancel() failed"); return NGX_ERROR; } if (rc == AIO_NOTCANCELED) { ngx_log_error(NGX_LOG_ALERT, c->log, 0, "aio_cancel() returned AIO_NOTCANCELED"); return NGX_ERROR; } return NGX_OK; } static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) { return ngx_kqueue_module_ctx.actions.process_events(cycle, timer, flags); } #endif /* NGX_HAVE_KQUEUE */