Mercurial > hg > nginx-quic
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 |
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 } |