]> git.kaiwu.me - nginx.git/commitdiff
fix case when the output filter should add incoming buffers
authorIgor Sysoev <igor@sysoev.ru>
Sun, 13 Sep 2009 06:28:17 +0000 (06:28 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Sun, 13 Sep 2009 06:28:17 +0000 (06:28 +0000)
while waiting on file AIO completion

src/core/ngx_buf.h
src/core/ngx_output_chain.c
src/http/ngx_http_copy_filter_module.c

index ba48544895cc905398bb7c54b7fe01c60bc88fac..847eaad05d6654a3a0d705dfe4a8de6ba51ae94c 100644 (file)
@@ -89,6 +89,11 @@ struct ngx_output_chain_ctx_s {
 #endif
     unsigned                     need_in_memory:1;
     unsigned                     need_in_temp:1;
+#if (NGX_HAVE_FILE_AIO)
+    unsigned                     aio:1;
+
+    ngx_output_chain_aio_pt      aio_handler;
+#endif
 
     off_t                        alignment;
 
@@ -99,10 +104,6 @@ struct ngx_output_chain_ctx_s {
 
     ngx_output_chain_filter_pt   output_filter;
     void                        *filter_ctx;
-
-#if (NGX_HAVE_FILE_AIO)
-    ngx_output_chain_aio_pt      aio;
-#endif
 };
 
 
index 0e392581237c8263fb0b5d985bd0874793880f0d..01f42a191e7f7b3da450976d0db5908402bfe59e 100644 (file)
@@ -74,6 +74,12 @@ ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)
         }
     }
 
+#if (NGX_HAVE_FILE_AIO)
+    if (ctx->aio) {
+        return NGX_AGAIN;
+    }
+#endif
+
     out = NULL;
     last_out = &out;
     last = NGX_NONE;
@@ -519,11 +525,11 @@ ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)
 
 #if (NGX_HAVE_FILE_AIO)
 
-        if (ctx->aio) {
+        if (ctx->aio_handler) {
             n = ngx_file_aio_read(src->file, dst->pos, (size_t) size,
                                   src->file_pos, ctx->pool);
             if (n == NGX_AGAIN) {
-                ctx->aio(ctx, src->file);
+                ctx->aio_handler(ctx, src->file);
                 return NGX_AGAIN;
             }
 
index 6be05a6a73f29facf07fb617dd3847f810d0a505..3c4c2880a2eb1e16f29bd92a8866859fc9772523 100644 (file)
@@ -87,10 +87,6 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
 
     c = r->connection;
 
-    if (r->aio) {
-        return NGX_AGAIN;
-    }
-
     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
                    "http copy filter: \"%V?%V\"", &r->uri, &r->args);
 
@@ -123,7 +119,7 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
 
 #if (NGX_HAVE_FILE_AIO)
         if (clcf->aio) {
-            ctx->aio = ngx_http_copy_aio_handler;
+            ctx->aio_handler = ngx_http_copy_aio_handler;
 #if (NGX_HAVE_AIO_SENDFILE)
             c->aio_sendfile = (clcf->aio == NGX_HTTP_AIO_SENDFILE);
 #endif
@@ -133,6 +129,10 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
         r->request_output = 1;
     }
 
+#if (NGX_HAVE_FILE_AIO)
+    ctx->aio = r->aio;
+#endif
+
     for ( ;; ) {
         rc = ngx_output_chain(ctx, in);