comparison src/os/unix/ngx_solaris_sendfilev_chain.c @ 198:34995c5ec6c4

nginx-0.0.1-2003-11-27-22:01:37 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 27 Nov 2003 19:01:37 +0000
parents 0b81c7a0b133
children 70e1c7d2b83d
comparison
equal deleted inserted replaced
197:0b81c7a0b133 198:34995c5ec6c4
7 ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in) 7 ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in)
8 { 8 {
9 int fd; 9 int fd;
10 char *prev; 10 char *prev;
11 off_t fprev; 11 off_t fprev;
12 size_t sent; 12 size_t sent, size;
13 ssize_t n; 13 ssize_t n;
14 ngx_int_t eintr; 14 ngx_int_t eintr;
15 ngx_err_t err;
15 sendfilevec_t *sfv; 16 sendfilevec_t *sfv;
16 ngx_array_t vec; 17 ngx_array_t vec;
17 ngx_event_t *wev; 18 ngx_event_t *wev;
18 ngx_chain_t *cl; 19 ngx_chain_t *cl;
19 20
24 } 25 }
25 26
26 do { 27 do {
27 fd = SFV_FD_SELF; 28 fd = SFV_FD_SELF;
28 prev = NULL; 29 prev = NULL;
30 fprev = 0;
29 sfv = NULL; 31 sfv = NULL;
30 eintr = 0; 32 eintr = 0;
31 sent = 0; 33 sent = 0;
34
35 ngx_init_array(vec, c->pool, 10, sizeof(sendfilevec_t),
36 NGX_CHAIN_ERROR);
32 37
33 /* create the sendfilevec and coalesce the neighbouring hunks */ 38 /* create the sendfilevec and coalesce the neighbouring hunks */
34 39
35 for (cl = in; cl; cl = cl->next) { 40 for (cl = in; cl; cl = cl->next) {
36 if (ngx_hunk_special(cl->hunk)) { 41 if (ngx_hunk_special(cl->hunk)) {
45 50
46 } else { 51 } else {
47 ngx_test_null(sfv, ngx_push_array(&vec), NGX_CHAIN_ERROR); 52 ngx_test_null(sfv, ngx_push_array(&vec), NGX_CHAIN_ERROR);
48 sfv->sfv_fd = SFV_FD_SELF; 53 sfv->sfv_fd = SFV_FD_SELF;
49 sfv->sfv_flag = 0; 54 sfv->sfv_flag = 0;
50 sfv->sfv_off = cl->hunk->pos; 55 sfv->sfv_off = (off_t) (uintptr_t) cl->hunk->pos;
51 sfv->sfv_len = cl->hunk->last - cl->hunk->pos; 56 sfv->sfv_len = cl->hunk->last - cl->hunk->pos;
52 } 57 }
53 58
54 prev = cl->hunk->last; 59 prev = cl->hunk->last;
55 60
70 75
71 fprev = cl->hunk->file_last; 76 fprev = cl->hunk->file_last;
72 } 77 }
73 } 78 }
74 79
75 n = sendfile(c->fd, vec->elts, vec->nelts, &sent); 80 n = sendfilev(c->fd, vec.elts, vec.nelts, &sent);
76 81
77 if (n == -1) { 82 if (n == -1) {
78 err = ngx_errno; 83 err = ngx_errno;
79 84
80 if (err == NGX_EINTR) { 85 if (err == NGX_EINTR) {
91 return NGX_CHAIN_ERROR; 96 return NGX_CHAIN_ERROR;
92 } 97 }
93 } 98 }
94 99
95 #if (NGX_DEBUG_WRITE_CHAIN) 100 #if (NGX_DEBUG_WRITE_CHAIN)
96 ngx_log_debug(c->log, "sendfilev: %d " SIZE_T_FMT ", n _ sent); 101 ngx_log_debug(c->log, "sendfilev: %d " SIZE_T_FMT _ n _ sent);
97 #endif 102 #endif
98 103
99 c->sent += sent; 104 c->sent += sent;
100 105
101 for (cl = in; cl; cl = cl->next) { 106 for (cl = in; cl; cl = cl->next) {