diff src/event/ngx_event_pipe.c @ 170:c42be4185301

nginx-0.0.1-2003-11-03-01:56:18 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 02 Nov 2003 22:56:18 +0000
parents ba5dbb949603
children caa57ddf6d77
line wrap: on
line diff
--- a/src/event/ngx_event_pipe.c
+++ b/src/event/ngx_event_pipe.c
@@ -42,24 +42,28 @@ int ngx_event_pipe(ngx_event_pipe_t *p, 
         do_write = 1;
     }
 
-    rev = p->upstream->read;
+    if (p->upstream->fd != -1) {
+        rev = p->upstream->read;
 
-    if (ngx_handle_read_event(rev, (rev->eof || rev->error)) == NGX_ERROR) {
-        return NGX_ABORT;
+        if (ngx_handle_read_event(rev, (rev->eof || rev->error)) == NGX_ERROR) {
+            return NGX_ABORT;
+        }
+
+        if (rev->active) {
+            ngx_add_timer(rev, p->read_timeout);
+        }
     }
 
-    if (rev->active) {
-        ngx_add_timer(rev, p->read_timeout);
-    }
-
-    wev = p->downstream->write;
+    if (p->downstream->fd != -1) {
+        wev = p->downstream->write;
 
-    if (ngx_handle_write_event(wev, p->send_lowat) == NGX_ERROR) {
-        return NGX_ABORT;
-    }
+        if (ngx_handle_write_event(wev, p->send_lowat) == NGX_ERROR) {
+            return NGX_ABORT;
+        }
 
-    if (wev->active) {
-        ngx_add_timer(wev, p->send_timeout);
+        if (wev->active) {
+            ngx_add_timer(wev, p->send_timeout);
+        }
     }
 
     return NGX_OK;
@@ -166,7 +170,9 @@ int ngx_event_pipe_read_upstream(ngx_eve
 
                 break;
 
-            } else if (p->cachable || p->temp_offset < p->max_temp_file_size) {
+            } else if (p->cachable
+                       || p->temp_file->offset < p->max_temp_file_size)
+            {
 
                 /*
                  * if it's allowed then save some hunks from r->in
@@ -175,7 +181,7 @@ int ngx_event_pipe_read_upstream(ngx_eve
 
                 rc = ngx_event_pipe_write_chain_to_temp_file(p);
 
-                ngx_log_debug(p->log, "temp offset: %d" _ p->temp_offset);
+                ngx_log_debug(p->log, "temp offset: %d" _ p->temp_file->offset);
 
                 if (rc == NGX_AGAIN) {
                     if (ngx_event_flags & NGX_USE_LEVEL_EVENT
@@ -414,8 +420,8 @@ int ngx_event_pipe_write_to_downstream(n
 
                 /* reset p->temp_offset if all hunks had been sent */
 
-                if (cl->hunk->file_last == p->temp_offset) {
-                    p->temp_offset = 0;
+                if (cl->hunk->file_last == p->temp_file->offset) {
+                    p->temp_file->offset = 0;
                 }
             }
         }
@@ -428,37 +434,29 @@ int ngx_event_pipe_write_to_downstream(n
 static int ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p)
 {
     int           rc, size, hsize;
+    char         *save_pos;
     ngx_hunk_t   *h;
     ngx_chain_t  *cl, *tl, *next, *out, **ll, **last_free;
 
     ngx_log_debug(p->log, "write to file");
 
-    if (p->temp_file->fd == NGX_INVALID_FILE) {
-        rc = ngx_create_temp_file(p->temp_file, p->temp_path, p->pool,
-                                  p->cachable);
-
-        if (rc == NGX_ERROR) {
-            return NGX_ABORT;
-        }
+    out = p->in;
 
-        if (rc == NGX_AGAIN) {
-            return NGX_AGAIN;
-        }
+    if (out->hunk->type & NGX_HUNK_PREREAD) {
+        save_pos = out->hunk->pos;
+        out->hunk->pos = out->hunk->start;
 
-        if (!p->cachable && p->temp_file_warn) {
-            ngx_log_error(NGX_LOG_WARN, p->log, 0, p->temp_file_warn);
-        }
+    } else {
+        save_pos = NULL;
     }
 
-    out = p->in;
-
     if (!p->cachable) {
 
         size = 0;
         cl = p->in;
         ll = NULL;
 
-ngx_log_debug(p->log, "offset: %d" _ p->temp_offset);
+ngx_log_debug(p->log, "offset: %d" _ p->temp_file->offset);
 
         do {
             hsize = cl->hunk->last - cl->hunk->pos;
@@ -466,7 +464,7 @@ ngx_log_debug(p->log, "offset: %d" _ p->
 ngx_log_debug(p->log, "hunk size: %d" _ hsize);
 
             if ((size + hsize > p->temp_file_write_size)
-                || (p->temp_offset + size + hsize > p->max_temp_file_size))
+               || (p->temp_file->offset + size + hsize > p->max_temp_file_size))
             {
                 break;
             }
@@ -493,8 +491,7 @@ ngx_log_debug(p->log, "size: %d" _ size)
         p->last_in = &p->in;
     }
 
-    if (ngx_write_chain_to_file(p->temp_file, out, p->temp_offset,
-                                                       p->pool) == NGX_ERROR) {
+    if (ngx_write_chain_to_temp_file(p->temp_file, out) == NGX_ERROR) {
         return NGX_ABORT;
     }
 
@@ -505,15 +502,21 @@ ngx_log_debug(p->log, "size: %d" _ size)
         /* void */
     }
 
+    if (out->hunk->type & NGX_HUNK_PREREAD) {
+        p->temp_file->offset += save_pos - out->hunk->pos;
+        out->hunk->pos = save_pos;
+        out->hunk->type &= ~NGX_HUNK_PREREAD;
+    }
+
     for (cl = out; cl; cl = next) {
         next = cl->next;
         cl->next = NULL;
 
         h = cl->hunk;
-        h->file = p->temp_file;
-        h->file_pos = p->temp_offset;
-        p->temp_offset += h->last - h->pos;
-        h->file_last = p->temp_offset;
+        h->file = &p->temp_file->file;
+        h->file_pos = p->temp_file->offset;
+        p->temp_file->offset += h->last - h->pos;
+        h->file_last = p->temp_file->offset;
 
         if (p->cachable) {
             h->type |= NGX_HUNK_FILE;