Mercurial > hg > nginx
comparison src/os/unix/ngx_linux_sendfile_chain.c @ 428:5e73d0ea4dab
nginx-0.0.11-2004-09-16-20:10:13 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 16 Sep 2004 16:10:13 +0000 |
parents | f209f3391020 |
children | da8c5707af39 |
comparison
equal
deleted
inserted
replaced
427:0d08eabe5c7b | 428:5e73d0ea4dab |
---|---|
15 * if off_t is 64 bit wide. So we use own sendfile() definition where offset | 15 * if off_t is 64 bit wide. So we use own sendfile() definition where offset |
16 * parameter is int32_t and use sendfile() with the file parts below 2G. | 16 * parameter is int32_t and use sendfile() with the file parts below 2G. |
17 * | 17 * |
18 * Linux 2.4.21 has a new sendfile64() syscall #239. | 18 * Linux 2.4.21 has a new sendfile64() syscall #239. |
19 */ | 19 */ |
20 | |
21 | |
22 #define NGX_HEADERS 8 | |
20 | 23 |
21 | 24 |
22 ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, | 25 ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, |
23 off_t limit) | 26 off_t limit) |
24 { | 27 { |
26 u_char *prev; | 29 u_char *prev; |
27 off_t fprev, send, sprev, aligned; | 30 off_t fprev, send, sprev, aligned; |
28 size_t fsize; | 31 size_t fsize; |
29 ssize_t size, sent; | 32 ssize_t size, sent; |
30 ngx_uint_t eintr, complete; | 33 ngx_uint_t eintr, complete; |
31 struct iovec *iov; | |
32 ngx_err_t err; | 34 ngx_err_t err; |
33 ngx_buf_t *file; | 35 ngx_buf_t *file; |
34 ngx_array_t header; | 36 ngx_array_t header; |
35 ngx_event_t *wev; | 37 ngx_event_t *wev; |
36 ngx_chain_t *cl; | 38 ngx_chain_t *cl; |
39 struct iovec *iov, headers[NGX_HEADERS]; | |
37 #if (HAVE_SENDFILE64) | 40 #if (HAVE_SENDFILE64) |
38 off_t offset; | 41 off_t offset; |
39 #else | 42 #else |
40 int32_t offset; | 43 int32_t offset; |
41 #endif | 44 #endif |
45 if (!wev->ready) { | 48 if (!wev->ready) { |
46 return in; | 49 return in; |
47 } | 50 } |
48 | 51 |
49 send = 0; | 52 send = 0; |
53 | |
54 header.elts = headers; | |
55 header.size = sizeof(struct iovec); | |
56 header.nalloc = NGX_HEADERS; | |
57 header.pool = c->pool; | |
50 | 58 |
51 for ( ;; ) { | 59 for ( ;; ) { |
52 file = NULL; | 60 file = NULL; |
53 fsize = 0; | 61 fsize = 0; |
54 eintr = 0; | 62 eintr = 0; |
55 complete = 0; | 63 complete = 0; |
56 sprev = send; | 64 sprev = send; |
57 | 65 |
58 ngx_init_array(header, c->pool, 10, sizeof(struct iovec), | 66 header.nelts = 0; |
59 NGX_CHAIN_ERROR); | |
60 | 67 |
61 prev = NULL; | 68 prev = NULL; |
62 iov = NULL; | 69 iov = NULL; |
63 | 70 |
64 /* create the iovec and coalesce the neighbouring bufs */ | 71 /* create the iovec and coalesce the neighbouring bufs */ |
83 | 90 |
84 if (prev == cl->buf->pos) { | 91 if (prev == cl->buf->pos) { |
85 iov->iov_len += size; | 92 iov->iov_len += size; |
86 | 93 |
87 } else { | 94 } else { |
88 ngx_test_null(iov, ngx_push_array(&header), NGX_CHAIN_ERROR); | 95 if (!(iov = ngx_array_push(&header))) { |
96 return NGX_CHAIN_ERROR; | |
97 } | |
98 | |
89 iov->iov_base = (void *) cl->buf->pos; | 99 iov->iov_base = (void *) cl->buf->pos; |
90 iov->iov_len = size; | 100 iov->iov_len = size; |
91 } | 101 } |
92 | 102 |
93 prev = cl->buf->pos + size; | 103 prev = cl->buf->pos + size; |