Mercurial > hg > nginx
view src/event/modules/ngx_aio_module.c @ 647:95d7da23ea53 release-0.3.45
nginx-0.3.45-RELEASE import
*) Feature: the "ssl_verify_client", "ssl_verify_depth", and
"ssl_client_certificate" directives.
*) Change: the $request_method variable now returns the main request
method.
*) Change: the ° symbol codes were changed in koi-win conversion
table.
*) Feature: the euro and N symbols were added to koi-win conversion
table.
*) Bugfix: if nginx distributed the requests among several backends and
some backend failed, then requests intended for this backend was
directed to one live backend only instead of being distributed among
the rest.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sat, 06 May 2006 16:28:56 +0000 |
parents | 9c2f3ed7a247 |
children | c95800738d2c |
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, int event, u_int flags); static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags); static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, u_int 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, 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, int event, u_int flags) { return ngx_kqueue_module_ctx.actions.add(ev, event, flags); } static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags) { return ngx_kqueue_module_ctx.actions.del(ev, event, flags); } static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, u_int 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 */ #if 0 /* 1 */ int ngx_posix_aio_process_events(ngx_log_t *log) { listen via SIGIO; aio_* via SIGxxx; sigsuspend()/sigwaitinfo()/sigtimedwait(); } /* 2 */ int ngx_posix_aio_process_events(ngx_log_t *log) { unmask signal listen via SIGIO; /* BUG: SIGIO can be delivered before aio_*() */ aio_suspend()/aiowait()/aio_waitcomplete() with timeout mask signal if (ngx_socket_errno == NGX_EINTR) look listen select()/accept() nb listen sockets else aio } /* 3 */ int ngx_posix_aio_process_events(ngx_log_t *log) { #if 0 unmask signal /* BUG: AIO signal can be delivered before select() */ select(listen); mask signal #endif pselect(listen, mask); if (ngx_socket_errno == NGX_EINTR) look ready array } void aio_sig_handler(int signo, siginfo_t *siginfo, void *context) { push siginfo->si_value.sival_ptr } #endif