annotate src/core/ngx_write_chain.c @ 62:8ccba41a678e

nginx-0.0.1-2003-02-12-09:55:42 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 12 Feb 2003 06:55:42 +0000
parents
children 36d2c25cc9bb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
62
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 #include <ngx_config.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 #include <ngx_core.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 #include <ngx_types.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6 #include <ngx_alloc.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_array.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_hunk.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_connection.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_sendv.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 #include <ngx_sendfile.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 #include <ngx_write_chain.h>
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 ngx_chain_t *ngx_write_chain(ngx_connection_t *c, ngx_chain_t *in, off_t flush)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 int rc, i, last;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 u_int flags;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 char *prev;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 off_t sent;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 ngx_iovec_t *iov;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 ngx_array_t header, trailer;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 ngx_hunk_t *file;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 ngx_chain_t *ce;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 ch = in;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 file = NULL;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 last = 0;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 ngx_init_array(header, c->pool, 10, sizeof(ngx_iovec_t), NGX_CHAIN_ERROR);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_init_array(trailer, c->pool, 10, sizeof(ngx_iovec_t), NGX_CHAIN_ERROR);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 do {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 header.nelts = 0;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 trailer.nelts = 0;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 if (ce->hunk->type & NGX_HUNK_IN_MEMORY) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 prev = NULL;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 iov = NULL;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 /* create iovec and coalesce the neighbouring chain entries */
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 while (ce && (ce->hunk->type & NGX_HUNK_IN_MEMORY))
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 if (prev == ce->hunk->pos.mem) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 iov->ngx_iov_len += ce->hunk->last.mem - ce->hunk->pos.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 } else {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 ngx_test_null(iov, ngx_push_array(&header),
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 NGX_CHAIN_ERROR);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 iov->ngx_iov_base = ce->hunk->pos.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 iov->ngx_iov_len = ce->hunk->last.mem - ce->hunk->pos.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 prev = ce->hunk->last.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 if (ce->hunk->type & NGX_HUNK_LAST) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 last = 1;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ce = ce->next;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 if (ce && (ce->hunk->type & NGX_HUNK_FILE)) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 file = ce->hunk;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 ce = ce->next;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 if (ce->hunk->type & NGX_HUNK_LAST) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 last = 1;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 #if (HAVE_MAX_SENDFILE_IOVEC)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 if (file && header->nelts > HAVE_MAX_SENDFILE_IOVEC) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 rc = ngx_sendv(c->fd, (ngx_iovec_t *) header->elts, header->nelts,
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 &sent);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 } else {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 if (ch && ch->hunk->type & NGX_HUNK_IN_MEMORY) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 prev = NULL;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 iov = NULL;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 if (prev == ch->hunk->pos.mem) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 iov->ngx_iov_len +=
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 ch->hunk->last.mem - ch->hunk->pos.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 } else {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 ngx_test_null(iov, ngx_push_array(trailer),
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 NGX_CHAIN_ERROR);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 iov->ngx_iov_base = ch->hunk->pos.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 iov->ngx_iov_len =
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ch->hunk->last.mem - ch->hunk->pos.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 prev = ch->hunk->last.mem;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 if (ch->hunk->type & NGX_HUNK_LAST) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 last = 1;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ch = ch->next;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 if (file) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 flags = ngx_sendfile_flags;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 #if (HAVE_SENDFILE_DISCONNECT)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 if (last && c->close) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 flags |= NGX_SENDFILE_DISCONNECT;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 rc = ngx_sendfile(c,
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 (ngx_iovec_t *) header->elts, header->nelts,
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 file->file->fd, file->pos.file,
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 (size_t) (file->last.file - file->pos.file),
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 (ngx_iovec_t *) trailer->elts, trailer->nelts,
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 &sent, flags);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 #if (HAVE_AIO_EVENT) && !(HAVE_IOCP_EVENT)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 } else if (ngx_event_flags & NGX_HAVE_AIO_EVENT) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 sent = 0;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 rc = NGX_AGAIN;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 iov = (ngx_iovec_t *) header->elts;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 for (i = 0; i < header->nelts; i++) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 rc = ngx_event_aio_write(c, iov[i].ngx_iov_base,
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 iov[i].ngx_iov_len);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 if (rc > 0) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 sent += rc;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 } else {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 break;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 if (rc < (int) iov->ngx_iov_len) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 break;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 } else {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 rc = ngx_sendv(c, (ngx_iovec_t *) header->elts, header->nelts);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 sent = rc > 0 ? rc: 0;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 #if (NGX_DEBUG_EVENT_WRITE)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 ngx_log_debug(c->log, "sendv: " OFF_FMT _ sent);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 #if (HAVE_MAX_SENDFILE_IOVEC)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 if (rc == NGX_ERROR)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 return (ngx_chain_t *) NGX_ERROR;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 c->sent += sent;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 flush -= sent;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 for (ch = in; ch; ch = ch->next) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 #if (NGX_DEBUG_EVENT_WRITE)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 ngx_log_debug(c->log, "event write: %x " QX_FMT " " OFF_FMT _
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 ch->hunk->type _
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 ch->hunk->pos.file _
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 ch->hunk->last.file - ch->hunk->pos.file);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 if (sent >= ch->hunk->last.file - ch->hunk->pos.file) {
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 sent -= ch->hunk->last.file - ch->hunk->pos.file;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 ch->hunk->pos.file = ch->hunk->last.file;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 #if (NGX_DEBUG_EVENT_WRITE)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 ngx_log_debug(c->log, "event write: " QX_FMT " 0 " OFF_FMT _
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 ch->hunk->pos.file _ sent);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 /*
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 if (ch->hunk->type & NGX_HUNK_LAST)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 break;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 */
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 continue;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 ch->hunk->pos.file += sent;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 #if (NGX_DEBUG_EVENT_WRITE)
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 ngx_log_debug(c->log, "event write: " QX_FMT " " OFF_FMT _
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 ch->hunk->pos.file _
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 ch->hunk->last.file - ch->hunk->pos.file);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 #endif
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 break;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 }
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 /* flush hunks if threaded state */
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 } while (c->write->context && flush > 0);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 ngx_destroy_array(&trailer);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 ngx_destroy_array(&header);
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 return ch;
8ccba41a678e nginx-0.0.1-2003-02-12-09:55:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 }