diff options
author | Igor Sysoev <igor@sysoev.ru> | 2004-09-17 16:07:35 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2004-09-17 16:07:35 +0000 |
commit | 307c3add7877ed447767be2381dd887c6699d7c6 (patch) | |
tree | 81d7591f4bdf604e66c19fb36cd96409fd85b9a6 /src/os/unix/ngx_writev_chain.c | |
parent | 95d00c435ace44f782bbb70dd5eac7fb1f9b8610 (diff) | |
download | nginx-307c3add7877ed447767be2381dd887c6699d7c6.tar.gz nginx-307c3add7877ed447767be2381dd887c6699d7c6.zip |
nginx-0.0.11-2004-09-17-20:07:35 import
Diffstat (limited to 'src/os/unix/ngx_writev_chain.c')
-rw-r--r-- | src/os/unix/ngx_writev_chain.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c index aba218d72..afe49a947 100644 --- 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_connection_t *c, ngx_chain_t *in, off_t limit) #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_connection_t *c, ngx_chain_t *in, off_t limit) 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; } |