mirror of
https://github.com/nginx/nginx.git
synced 2025-06-06 00:42:40 +08:00
Removed the obsolete aio module.
This commit is contained in:
parent
39386c951c
commit
c1882d9f3f
@ -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 ;;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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,
|
||||
|
@ -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 */
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user