diff src/os/unix/ngx_writev_chain.c @ 429:694cd6cdb714

nginx-0.0.11-2004-09-17-20:07:35 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 17 Sep 2004 16:07:35 +0000
parents 744ccb59062d
children da8c5707af39
line wrap: on
line diff
--- a/src/os/unix/ngx_writev_chain.c
+++ b/src/os/unix/ngx_writev_chain.c
@@ -4,17 +4,20 @@
 #include <ngx_event.h>
 
 
+#define NGX_IOVS  8
+
+
 ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
 {
-    u_char          *prev;
-    ssize_t          n, size;
-    off_t            send, sprev, sent;
-    struct iovec    *iov;
-    ngx_uint_t       eintr, complete;
-    ngx_err_t        err;
-    ngx_array_t      vec;
-    ngx_chain_t     *cl;
-    ngx_event_t     *wev;
+    u_char        *prev;
+    ssize_t        n, size;
+    off_t          send, sprev, sent;
+    ngx_uint_t     eintr, complete;
+    ngx_err_t      err;
+    ngx_array_t    vec;
+    ngx_chain_t   *cl;
+    ngx_event_t   *wev;
+    struct iovec  *iov, iovs[NGX_IOVS];
 
     wev = c->write;
 
@@ -34,17 +37,22 @@ ngx_chain_t *ngx_writev_chain(ngx_connec
 
 #endif
 
-    ngx_init_array(vec, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR);
-
     send = 0;
     complete = 0;
 
+    vec.elts = iovs;
+    vec.size = sizeof(struct iovec);
+    vec.nalloc = NGX_IOVS;
+    vec.pool = c->pool;
+
     for ( ;; ) {
         prev = NULL;
         iov = NULL;
         eintr = 0;
         sprev = send;
 
+        vec.nelts = 0;
+
         /* create the iovec and coalesce the neighbouring bufs */
 
         for (cl = in; cl && vec.nelts < IOV_MAX && send < limit; cl = cl->next)
@@ -63,7 +71,10 @@ ngx_chain_t *ngx_writev_chain(ngx_connec
                 iov->iov_len += size;
 
             } else {
-                ngx_test_null(iov, ngx_push_array(&vec), NGX_CHAIN_ERROR);
+                if (!(iov = ngx_array_push(&vec))) {
+                    return NGX_CHAIN_ERROR;
+                }
+
                 iov->iov_base = (void *) cl->buf->pos;
                 iov->iov_len = size;
             }