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
+++ b/src/os/unix/ngx_freebsd_write_chain.c
@@ -15,7 +15,7 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx
 {
     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_chain_t *ngx_freebsd_write_chain(ngx
     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 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx
         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 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx
 
 #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 @@ ngx_chain_t *ngx_freebsd_write_chain(ngx
 
     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;
     }