Removed the obsolete aio module.

This commit is contained in:
Ruslan Ermilov 2015-04-22 18:57:32 +03:00
parent 39386c951c
commit c1882d9f3f
20 changed files with 14 additions and 630 deletions

View File

@ -41,7 +41,6 @@ EVENT_FOUND=NO
EVENT_RTSIG=NO
EVENT_SELECT=NO
EVENT_POLL=NO
EVENT_AIO=NO
USE_THREADS=NO
@ -195,7 +194,6 @@ do
--without-select_module) EVENT_SELECT=NONE ;;
--with-poll_module) EVENT_POLL=YES ;;
--without-poll_module) EVENT_POLL=NONE ;;
--with-aio_module) EVENT_AIO=YES ;;
--with-threads) USE_THREADS=YES ;;

View File

@ -99,26 +99,6 @@ then
fi
if [ $EVENT_AIO = YES ]; then
if [ \( $version -lt 500000 -a $version -ge 430000 \) \
-o $version -ge 500014 ]
then
have=NGX_HAVE_AIO . auto/have
EVENT_MODULES="$EVENT_MODULES $AIO_MODULE"
CORE_SRCS="$CORE_SRCS $AIO_SRCS"
else
cat << END
$0: error: the kqueue does not support AIO on this FreeBSD version
END
exit 1
fi
fi
# cpuset_setaffinity()
if [ $version -ge 701000 ]; then

View File

@ -36,5 +36,4 @@ if [ $NGX_IPV6 = YES ]; then
have=NGX_HAVE_INET6 . auto/have
fi
have=NGX_HAVE_AIO . auto/have
have=NGX_HAVE_IOCP . auto/have

View File

@ -130,13 +130,6 @@ RTSIG_SRCS=src/event/modules/ngx_rtsig_module.c
IOCP_MODULE=ngx_iocp_module
IOCP_SRCS=src/event/modules/ngx_iocp_module.c
AIO_MODULE=ngx_aio_module
AIO_SRCS="src/event/modules/ngx_aio_module.c \
src/os/unix/ngx_aio_read.c \
src/os/unix/ngx_aio_write.c \
src/os/unix/ngx_aio_read_chain.c \
src/os/unix/ngx_aio_write_chain.c"
FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"
LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"

View File

@ -389,7 +389,7 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
#endif
/* TODO: close on exit */
if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {
if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
if (ngx_nonblocking(s) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
ngx_nonblocking_n " %V failed",

View File

@ -3092,7 +3092,7 @@ ngx_udp_connect(ngx_udp_connection_t *uc)
rc = connect(s, uc->sockaddr, uc->socklen);
/* TODO: aio, iocp */
/* TODO: iocp */
if (rc == -1) {
ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,

View File

@ -1,171 +0,0 @@
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
extern ngx_event_module_t ngx_kqueue_module_ctx;
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, /* trigger a notify */
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 = 0;
c->write->active = 0;
return NGX_OK;
}
if (rc == AIO_ALLDONE) {
c->read->active = 0;
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 */

View File

@ -125,7 +125,7 @@ ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer)
ngx_event_actions = ngx_iocp_module_ctx.actions;
ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT;
ngx_event_flags = NGX_USE_IOCP_EVENT;
if (timer == 0) {
return NGX_OK;

View File

@ -330,7 +330,7 @@ ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
}
}
/* aio, iocp, rtsig */
/* iocp, rtsig */
return NGX_OK;
}
@ -409,7 +409,7 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat)
}
}
/* aio, iocp, rtsig */
/* iocp, rtsig */
return NGX_OK;
}

View File

@ -103,14 +103,8 @@ struct ngx_event_s {
ngx_event_handler_pt handler;
#if (NGX_HAVE_AIO)
#if (NGX_HAVE_IOCP)
ngx_event_ovlp_t ovlp;
#else
struct aiocb aiocb;
#endif
#endif
ngx_uint_t index;
@ -251,14 +245,12 @@ extern ngx_event_actions_t ngx_event_actions;
#define NGX_USE_RTSIG_EVENT 0x00000080
/*
* No need to add or delete the event filters: overlapped, aio_read,
* aioread, io_submit.
* Obsolete.
*/
#define NGX_USE_AIO_EVENT 0x00000100
/*
* Need to add socket or handle only once: i/o completion port.
* It also requires NGX_HAVE_AIO and NGX_USE_AIO_EVENT to be set.
*/
#define NGX_USE_IOCP_EVENT 0x00000200

View File

@ -176,10 +176,10 @@ ngx_event_accept(ngx_event_t *ev)
return;
}
/* set a blocking mode for aio and non-blocking mode for others */
/* set a blocking mode for iocp and non-blocking mode for others */
if (ngx_inherited_nonblocking) {
if (ngx_event_flags & NGX_USE_AIO_EVENT) {
if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
if (ngx_blocking(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
ngx_blocking_n " failed");
@ -189,7 +189,7 @@ ngx_event_accept(ngx_event_t *ev)
}
} else {
if (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {
if (!(ngx_event_flags & (NGX_USE_IOCP_EVENT|NGX_USE_RTSIG_EVENT))) {
if (ngx_nonblocking(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
ngx_nonblocking_n " failed");
@ -232,8 +232,7 @@ ngx_event_accept(ngx_event_t *ev)
wev->ready = 1;
if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT)) {
/* rtsig, aio, iocp */
if (ngx_event_flags & (NGX_USE_IOCP_EVENT|NGX_USE_RTSIG_EVENT)) {
rev->ready = 1;
}

View File

@ -171,13 +171,11 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
return NGX_OK;
}
if (ngx_event_flags & NGX_USE_AIO_EVENT) {
if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno,
"connect(): %d", rc);
/* aio, iocp */
if (ngx_blocking(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
ngx_blocking_n " failed");

View File

@ -349,7 +349,7 @@ ngx_http_init_connection(ngx_connection_t *c)
}
if (rev->ready) {
/* the deferred accept(), rtsig, aio, iocp */
/* the deferred accept(), rtsig, iocp */
if (ngx_use_accept_mutex) {
ngx_post_event(rev, &ngx_posted_events);

View File

@ -2911,7 +2911,7 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
p->buf_to_file->temporary = 1;
}
if (ngx_event_flags & NGX_USE_AIO_EVENT) {
if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
/* the posted aio operation may corrupt a shadow buffer */
p->single_buf = 1;
}

View File

@ -1,109 +0,0 @@
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
extern int ngx_kqueue;
ssize_t
ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
{
int n;
ngx_event_t *rev;
rev = c->read;
if (!rev->ready) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
return NGX_AGAIN;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
"rev->complete: %d", rev->complete);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
"aio size: %d", size);
if (!rev->complete) {
ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
rev->aiocb.aio_fildes = c->fd;
rev->aiocb.aio_buf = buf;
rev->aiocb.aio_nbytes = size;
#if (NGX_HAVE_KQUEUE)
rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev;
#endif
if (aio_read(&rev->aiocb) == -1) {
ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno,
"aio_read() failed");
rev->error = 1;
return NGX_ERROR;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
"aio_read: #%d OK", c->fd);
rev->active = 1;
rev->ready = 0;
}
rev->complete = 0;
n = aio_error(&rev->aiocb);
if (n == -1) {
ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed");
rev->error = 1;
return NGX_ERROR;
}
if (n != 0) {
if (n == NGX_EINPROGRESS) {
if (rev->ready) {
ngx_log_error(NGX_LOG_ALERT, c->log, n,
"aio_read() still in progress");
rev->ready = 0;
}
return NGX_AGAIN;
}
ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed");
rev->error = 1;
rev->ready = 0;
return NGX_ERROR;
}
n = aio_return(&rev->aiocb);
if (n == -1) {
ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
"aio_return() failed");
rev->error = 1;
rev->ready = 0;
return NGX_ERROR;
}
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
"aio_read: #%d %d", c->fd, n);
if (n == 0) {
rev->eof = 1;
rev->ready = 0;
} else {
rev->ready = 1;
}
rev->active = 0;
return n;
}

View File

@ -1,78 +0,0 @@
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
ssize_t
ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit)
{
int n;
u_char *buf, *prev;
size_t size;
ssize_t total;
if (c->read->pending_eof) {
c->read->ready = 0;
return 0;
}
total = 0;
while (cl) {
/* we can post the single aio operation only */
if (!c->read->ready) {
return total ? total : NGX_AGAIN;
}
buf = cl->buf->last;
prev = cl->buf->last;
size = 0;
/* coalesce the neighbouring bufs */
while (cl && prev == cl->buf->last) {
size += cl->buf->end - cl->buf->last;
prev = cl->buf->end;
cl = cl->next;
}
n = ngx_aio_read(c, buf, size);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n);
if (n == NGX_AGAIN) {
return total ? total : NGX_AGAIN;
}
if (n == NGX_ERROR) {
return NGX_ERROR;
}
if (n == 0) {
c->read->pending_eof = 1;
if (total) {
c->read->eof = 0;
c->read->ready = 1;
}
return total;
}
if (n > 0) {
total += n;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
"aio_read total: %d", total);
}
return total ? total : NGX_AGAIN;
}

View File

@ -1,109 +0,0 @@
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
extern int ngx_kqueue;
ssize_t
ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size)
{
int n;
ngx_event_t *wev;
wev = c->write;
if (!wev->ready) {
return NGX_AGAIN;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0,
"aio: wev->complete: %d", wev->complete);
if (!wev->complete) {
ngx_memzero(&wev->aiocb, sizeof(struct aiocb));
wev->aiocb.aio_fildes = c->fd;
wev->aiocb.aio_buf = buf;
wev->aiocb.aio_nbytes = size;
#if (NGX_HAVE_KQUEUE)
wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev;
#endif
if (aio_write(&wev->aiocb) == -1) {
ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno,
"aio_write() failed");
return NGX_ERROR;
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK");
wev->active = 1;
wev->ready = 0;
}
wev->complete = 0;
n = aio_error(&wev->aiocb);
if (n == -1) {
ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed");
wev->error = 1;
return NGX_ERROR;
}
if (n != 0) {
if (n == NGX_EINPROGRESS) {
if (wev->ready) {
ngx_log_error(NGX_LOG_ALERT, wev->log, n,
"aio_write() still in progress");
wev->ready = 0;
}
return NGX_AGAIN;
}
ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed");
wev->error = 1;
wev->ready = 0;
#if 1
n = aio_return(&wev->aiocb);
if (n == -1) {
ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
"aio_return() failed");
}
ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n);
#endif
return NGX_ERROR;
}
n = aio_return(&wev->aiocb);
if (n == -1) {
ngx_log_error(NGX_LOG_ALERT, wev->log, ngx_errno,
"aio_return() failed");
wev->error = 1;
wev->ready = 0;
return NGX_ERROR;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n);
wev->active = 0;
wev->ready = 1;
return n;
}

View File

@ -1,100 +0,0 @@
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
ngx_chain_t *
ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{
u_char *buf, *prev;
off_t send, sent;
size_t len;
ssize_t n, size;
ngx_chain_t *cl;
/* the maximum limit size is the maximum size_t value - the page size */
if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) {
limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
}
send = 0;
sent = 0;
cl = in;
while (cl) {
if (cl->buf->pos == cl->buf->last) {
cl = cl->next;
continue;
}
/* we can post the single aio operation only */
if (!c->write->ready) {
return cl;
}
buf = cl->buf->pos;
prev = buf;
len = 0;
/* coalesce the neighbouring bufs */
while (cl && prev == cl->buf->pos && send < limit) {
if (ngx_buf_special(cl->buf)) {
continue;
}
size = cl->buf->last - cl->buf->pos;
if (send + size > limit) {
size = limit - send;
}
len += size;
prev = cl->buf->pos + size;
send += size;
cl = cl->next;
}
n = ngx_aio_write(c, buf, len);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %z", n);
if (n == NGX_ERROR) {
return NGX_CHAIN_ERROR;
}
if (n > 0) {
sent += n;
c->sent += n;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
"aio_write sent: %O", c->sent);
for (cl = in; cl; cl = cl->next) {
if (sent >= cl->buf->last - cl->buf->pos) {
sent -= cl->buf->last - cl->buf->pos;
cl->buf->pos = cl->buf->last;
continue;
}
cl->buf->pos += sent;
break;
}
}
return cl;
}

View File

@ -86,7 +86,7 @@
#endif
#if (NGX_HAVE_FILE_AIO || NGX_HAVE_AIO)
#if (NGX_HAVE_FILE_AIO)
#include <aio.h>
typedef struct aiocb ngx_aiocb_t;
#endif

View File

@ -48,14 +48,6 @@ ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size);
ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in,
off_t limit);
#if (NGX_HAVE_AIO)
ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size);
ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit);
ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size);
ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in,
off_t limit);
#endif
#if (IOV_MAX > 64)
#define NGX_IOVS_PREALLOCATE 64