diff src/os/unix/ngx_aio_write_chain.c @ 144:ef8c87afcfc5

nginx-0.0.1-2003-10-12-20:49:16 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 12 Oct 2003 16:49:16 +0000
parents b48066122884
children 84036764e215
line wrap: on
line diff
--- a/src/os/unix/ngx_aio_write_chain.c
+++ b/src/os/unix/ngx_aio_write_chain.c
@@ -1,6 +1,7 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
+#include <ngx_event.h>
 #include <ngx_aio.h>
 
 
@@ -17,10 +18,18 @@ ngx_chain_t *ngx_aio_write_chain(ngx_con
     ce = in;
 
     while (ce) {
+
+        /* we can post the single aio operation only */
+
+        if (c->write->active) {
+            return ce;
+        }
+
         buf = prev = ce->hunk->pos;
         size = 0;
 
         /* coalesce the neighbouring chain entries */
+
         while (ce && prev == ce->hunk->pos) {
             size += ce->hunk->last - ce->hunk->pos;
             prev = ce->hunk->last;
@@ -33,35 +42,33 @@ ngx_chain_t *ngx_aio_write_chain(ngx_con
         ngx_log_debug(c->log, "aio_write rc: %d" _ rc);
 #endif
 
+        if (rc == NGX_ERROR) {
+            return NGX_CHAIN_ERROR;
+        }
+
         if (rc > 0) {
             sent += rc;
             c->sent += rc;
+        }
 
-        } else if (rc == NGX_ERROR) {
-            return NGX_CHAIN_ERROR;
+#if (NGX_DEBUG_WRITE_CHAIN)
+        ngx_log_debug(c->log, "aio_write sent: " OFF_FMT _ c->sent);
+#endif
+
+        for (ce = in; ce; ce = ce->next) {
 
-        } else if (rc == NGX_AGAIN) {
+            if (sent >= ce->hunk->last - ce->hunk->pos) {
+                sent -= ce->hunk->last - ce->hunk->pos;
+                ce->hunk->pos = ce->hunk->last;
+
+                continue;
+            }
+
+            ce->hunk->pos += sent;
+
             break;
         }
     }
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-    ngx_log_debug(c->log, "aio_write sent: " OFF_FMT _ c->sent);
-#endif
-
-    for (ce = in; ce; ce = ce->next) {
-
-        if (sent >= ce->hunk->last - ce->hunk->pos) {
-            sent -= ce->hunk->last - ce->hunk->pos;
-            ce->hunk->pos = ce->hunk->last;
-
-            continue;
-        }
-
-        ce->hunk->pos += sent;
-
-        break;
-    }
-
     return ce;
 }