Mercurial > hg > nginx
diff src/os/unix/ngx_freebsd_write_chain.c @ 67:5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 11 Mar 2003 20:38:13 +0000 |
parents | 36d2c25cc9bb |
children | 17ab1af8c3dd |
line wrap: on
line diff
--- a/src/os/unix/ngx_freebsd_write_chain.c Wed Mar 05 17:30:51 2003 +0000 +++ b/src/os/unix/ngx_freebsd_write_chain.c Tue Mar 11 20:38:13 2003 +0000 @@ -15,7 +15,7 @@ { int rc; char *prev; - size_t hsize; + size_t hsize, size; off_t sent; struct iovec *iov; struct sf_hdtr hdtr; @@ -32,54 +32,54 @@ ngx_init_array(trailer, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR); /* create the header iovec */ - if (ce->hunk->type & NGX_HUNK_IN_MEMORY) { + if (ngx_hunk_in_memory_only(ce->hunk)) { prev = NULL; iov = NULL; /* create the iovec and coalesce the neighbouring chain entries */ - while (ce && (ce->hunk->type & NGX_HUNK_IN_MEMORY)) - { - if (prev == ce->hunk->pos.mem) { - iov->iov_len += ce->hunk->last.mem - ce->hunk->pos.mem; - prev = ce->hunk->last.mem; + while (ce && ngx_hunk_in_memory_only(ce->hunk)) { + + if (prev == ce->hunk->pos) { + iov->iov_len += ce->hunk->last - ce->hunk->pos; + prev = ce->hunk->last; } else { ngx_test_null(iov, ngx_push_array(&header), NGX_CHAIN_ERROR); - iov->iov_base = ce->hunk->pos.mem; - iov->iov_len = ce->hunk->last.mem - ce->hunk->pos.mem; - prev = ce->hunk->last.mem; + iov->iov_base = ce->hunk->pos; + iov->iov_len = ce->hunk->last - ce->hunk->pos; + prev = ce->hunk->last; } #if (HAVE_FREEBSD_SENDFILE_NBYTES_BUG) - hsize += ce->hunk->last.mem - ce->hunk->pos.mem; + hsize += ce->hunk->last - ce->hunk->pos; #endif ce = ce->next; } } - /* TODO: coalesce the neighbouring shadow file hunks */ + /* TODO: coalesce the neighbouring file hunks */ if (ce && (ce->hunk->type & NGX_HUNK_FILE)) { file = ce->hunk; ce = ce->next; } /* create the trailer iovec */ - if (ce && ce->hunk->type & NGX_HUNK_IN_MEMORY) { + if (ce && ngx_hunk_in_memory_only(ce->hunk)) { prev = NULL; iov = NULL; /* create the iovec and coalesce the neighbouring chain entries */ - while (ce && (ce->hunk->type & NGX_HUNK_IN_MEMORY)) { + while (ce && ngx_hunk_in_memory_only(ce->hunk)) { - if (prev == ce->hunk->pos.mem) { - iov->iov_len += ce->hunk->last.mem - ce->hunk->pos.mem; - prev = ce->hunk->last.mem; + if (prev == ce->hunk->pos) { + iov->iov_len += ce->hunk->last - ce->hunk->pos; + prev = ce->hunk->last; } else { ngx_test_null(iov, ngx_push_array(&trailer), NGX_CHAIN_ERROR); - iov->iov_base = ce->hunk->pos.mem; - iov->iov_len = ce->hunk->last.mem - ce->hunk->pos.mem; - prev = ce->hunk->last.mem; + iov->iov_base = ce->hunk->pos; + iov->iov_len = ce->hunk->last - ce->hunk->pos; + prev = ce->hunk->last; } ce = ce->next; @@ -92,8 +92,8 @@ hdtr.trailers = (struct iovec *) trailer.elts; hdtr.trl_cnt = trailer.nelts; - rc = sendfile(file->file->fd, c->fd, file->pos.file, - (size_t) (file->last.file - file->pos.file) + hsize, + rc = sendfile(file->file->fd, c->fd, file->file_pos, + (size_t) (file->file_last - file->file_pos) + hsize, &hdtr, &sent, 0); if (rc == -1) { @@ -110,8 +110,8 @@ #if (NGX_DEBUG_WRITE_CHAIN) ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _ - rc _ file->pos.file _ *sent _ - (size_t) (file->last.file - file->pos.file) + hsize); + rc _ file->file_pos _ sent _ + (size_t) (file->file_last - file->file_pos) + hsize); #endif } else { @@ -142,31 +142,33 @@ for (ce = in; ce; ce = ce->next) { -#if (NGX_DEBUG_WRITE_CHAIN) - ngx_log_debug(c->log, "write chain: %x %qx %qd" _ - ce->hunk->type _ - ce->hunk->pos.file _ - ce->hunk->last.file - ce->hunk->pos.file); -#endif + if (ce->hunk->type & NGX_HUNK_IN_MEMORY) { + size = ce->hunk->last - ce->hunk->pos; + } else { + size = ce->hunk->file_last - ce->hunk->file_pos; + } + + if (sent >= size) { + sent -= size; - if (sent >= ce->hunk->last.file - ce->hunk->pos.file) { - sent -= ce->hunk->last.file - ce->hunk->pos.file; - ce->hunk->pos.file = ce->hunk->last.file; + if (ce->hunk->type & NGX_HUNK_IN_MEMORY) { + ce->hunk->pos = ce->hunk->last; + } -#if (NGX_DEBUG_WRITE_CHAIN) - ngx_log_debug(c->log, "write chain done: %qx %qd" _ - ce->hunk->pos.file _ sent); -#endif + if (ce->hunk->type & NGX_HUNK_FILE) { + ce->hunk->file_pos = ce->hunk->file_last; + } + continue; } - ce->hunk->pos.file += sent; + if (ce->hunk->type & NGX_HUNK_IN_MEMORY) { + ce->hunk->pos += sent; + } -#if (NGX_DEBUG_WRITE_CHAIN) - ngx_log_debug(c->log, "write chain rest: %qx %qd" _ - ce->hunk->pos.file _ - ce->hunk->last.file - ce->hunk->pos.file); -#endif + if (ce->hunk->type & NGX_HUNK_FILE) { + ce->hunk->file_pos += sent; + } break; }