aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/http/ngx_http_copy_filter_module.c2
-rw-r--r--src/http/ngx_http_file_cache.c71
-rw-r--r--src/os/unix/ngx_file_aio_read.c11
-rw-r--r--src/os/unix/ngx_files.c7
-rw-r--r--src/os/unix/ngx_files.h2
-rw-r--r--src/os/unix/ngx_linux_aio_read.c13
6 files changed, 63 insertions, 43 deletions
diff --git a/src/http/ngx_http_copy_filter_module.c b/src/http/ngx_http_copy_filter_module.c
index 3c4c2880a..a1b616a68 100644
--- a/src/http/ngx_http_copy_filter_module.c
+++ b/src/http/ngx_http_copy_filter_module.c
@@ -118,7 +118,7 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
ctx->filter_ctx = r;
#if (NGX_HAVE_FILE_AIO)
- if (clcf->aio) {
+ if (ngx_file_aio && clcf->aio) {
ctx->aio_handler = ngx_http_copy_aio_handler;
#if (NGX_HAVE_AIO_SENDFILE)
c->aio_sendfile = (clcf->aio == NGX_HTTP_AIO_SENDFILE);
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index 0a9b761cd..431b1e52b 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -12,6 +12,8 @@
static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r,
ngx_http_cache_t *c);
+static ssize_t ngx_http_file_cache_aio_read(ngx_http_request_t *r,
+ ngx_http_cache_t *c);
#if (NGX_HAVE_FILE_AIO)
static void ngx_http_cache_aio_event_handler(ngx_event_t *ev);
#endif
@@ -330,36 +332,9 @@ ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
c = r->cache;
-#if (NGX_HAVE_FILE_AIO)
- {
- ngx_http_core_loc_conf_t *clcf;
-
- clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
-
- if (clcf->aio) {
- n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);
-
- if (n == NGX_AGAIN) {
- c->file.aio->data = r;
- c->file.aio->handler = ngx_http_cache_aio_event_handler;
-
- r->main->blocked++;
- r->aio = 1;
-
- return NGX_AGAIN;
- }
-
- } else {
- n = ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
- }
- }
-#else
-
- n = ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
+ n = ngx_http_file_cache_aio_read(r, c);
-#endif
-
- if (n == NGX_ERROR) {
+ if (n < 0) {
return n;
}
@@ -432,8 +407,46 @@ ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
}
+static ssize_t
+ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c)
+{
#if (NGX_HAVE_FILE_AIO)
+ ssize_t n;
+ ngx_http_core_loc_conf_t *clcf;
+ if (!ngx_file_aio) {
+ goto noaio;
+ }
+
+ clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+ if (!clcf->aio) {
+ goto noaio;
+ }
+
+ n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);
+
+ if (n != NGX_AGAIN) {
+ return n;
+ }
+
+ c->file.aio->data = r;
+ c->file.aio->handler = ngx_http_cache_aio_event_handler;
+
+ r->main->blocked++;
+ r->aio = 1;
+
+ return NGX_AGAIN;
+
+noaio:
+
+#endif
+
+ return ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
+}
+
+
+#if (NGX_HAVE_FILE_AIO)
static void
ngx_http_cache_aio_event_handler(ngx_event_t *ev)
diff --git a/src/os/unix/ngx_file_aio_read.c b/src/os/unix/ngx_file_aio_read.c
index 19a75890c..ef7a46107 100644
--- a/src/os/unix/ngx_file_aio_read.c
+++ b/src/os/unix/ngx_file_aio_read.c
@@ -39,12 +39,11 @@ ssize_t
ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
ngx_pool_t *pool)
{
- int n;
- ngx_event_t *ev;
- ngx_event_aio_t *aio;
- static ngx_uint_t enosys = 0;
+ int n;
+ ngx_event_t *ev;
+ ngx_event_aio_t *aio;
- if (enosys) {
+ if (!ngx_file_aio) {
return ngx_read_file(file, buf, size, offset);
}
@@ -116,7 +115,7 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
"aio_read(\"%V\") failed", &file->name);
if (n == NGX_ENOSYS) {
- enosys = 1;
+ ngx_file_aio = 0;
return ngx_read_file(file, buf, size, offset);
}
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index 618d4e214..2264cc13e 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -8,6 +8,13 @@
#include <ngx_core.h>
+#if (NGX_HAVE_FILE_AIO)
+
+ngx_uint_t ngx_file_aio = 1;
+
+#endif
+
+
ssize_t
ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
{
diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
index 966262143..2efd24778 100644
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -313,6 +313,8 @@ size_t ngx_fs_bsize(u_char *name);
ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size,
off_t offset, ngx_pool_t *pool);
+extern ngx_uint_t ngx_file_aio;
+
#endif
diff --git a/src/os/unix/ngx_linux_aio_read.c b/src/os/unix/ngx_linux_aio_read.c
index 3b4185c8b..834a11d07 100644
--- a/src/os/unix/ngx_linux_aio_read.c
+++ b/src/os/unix/ngx_linux_aio_read.c
@@ -27,13 +27,12 @@ ssize_t
ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
ngx_pool_t *pool)
{
- long n;
- struct iocb *piocb[1];
- ngx_event_t *ev;
- ngx_event_aio_t *aio;
- static ngx_uint_t enosys = 0;
+ long n;
+ struct iocb *piocb[1];
+ ngx_event_t *ev;
+ ngx_event_aio_t *aio;
- if (enosys) {
+ if (!ngx_file_aio) {
return ngx_read_file(file, buf, size, offset);
}
@@ -109,7 +108,7 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
"io_submit(\"%V\") failed", &file->name);
if (n == NGX_ENOSYS) {
- enosys = 1;
+ ngx_file_aio = 0;
return ngx_read_file(file, buf, size, offset);
}