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;