comparison src/os/unix/ngx_solaris_sendfilev_chain.c @ 5914:4dd67e5d958e

Refactored ngx_solaris_sendfilev_chain(). Though ngx_solaris_sendfilev_chain() shouldn't suffer from the problem mentioned in d1bde5c3c5d2 since currently IOV_MAX on Solaris is 16, but this follows the change from 3d5717550371 in order to make the code look similar to other systems and potentially eliminates the problem in the future.
author Valentin Bartenev <vbart@nginx.com>
date Wed, 19 Nov 2014 21:17:11 +0300
parents de68ed551bfb
children 646985c55393
comparison
equal deleted inserted replaced
5913:8e903522c17a 5914:4dd67e5d958e
46 off_t size, send, prev_send, aligned, fprev; 46 off_t size, send, prev_send, aligned, fprev;
47 size_t sent; 47 size_t sent;
48 ssize_t n; 48 ssize_t n;
49 ngx_int_t eintr; 49 ngx_int_t eintr;
50 ngx_err_t err; 50 ngx_err_t err;
51 ngx_uint_t nsfv;
51 sendfilevec_t *sfv, sfvs[NGX_SENDFILEVECS]; 52 sendfilevec_t *sfv, sfvs[NGX_SENDFILEVECS];
52 ngx_array_t vec;
53 ngx_event_t *wev; 53 ngx_event_t *wev;
54 ngx_chain_t *cl; 54 ngx_chain_t *cl;
55 55
56 wev = c->write; 56 wev = c->write;
57 57
70 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; 70 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
71 } 71 }
72 72
73 73
74 send = 0; 74 send = 0;
75
76 vec.elts = sfvs;
77 vec.size = sizeof(sendfilevec_t);
78 vec.nalloc = NGX_SENDFILEVECS;
79 vec.pool = c->pool;
80 75
81 for ( ;; ) { 76 for ( ;; ) {
82 fd = SFV_FD_SELF; 77 fd = SFV_FD_SELF;
83 prev = NULL; 78 prev = NULL;
84 fprev = 0; 79 fprev = 0;
85 sfv = NULL; 80 sfv = NULL;
86 eintr = 0; 81 eintr = 0;
87 sent = 0; 82 sent = 0;
88 prev_send = send; 83 prev_send = send;
89 84
90 vec.nelts = 0; 85 nsfv = 0;
91 86
92 /* create the sendfilevec and coalesce the neighbouring bufs */ 87 /* create the sendfilevec and coalesce the neighbouring bufs */
93 88
94 for (cl = in; cl && send < limit; cl = cl->next) { 89 for (cl = in; cl && send < limit; cl = cl->next) {
95 90
108 103
109 if (prev == cl->buf->pos) { 104 if (prev == cl->buf->pos) {
110 sfv->sfv_len += (size_t) size; 105 sfv->sfv_len += (size_t) size;
111 106
112 } else { 107 } else {
113 if (vec.nelts >= IOV_MAX) { 108 if (nsfv == NGX_SENDFILEVECS) {
114 break; 109 break;
115 } 110 }
116 111
117 sfv = ngx_array_push(&vec); 112 sfv = &sfvs[nsfv++];
118 if (sfv == NULL) {
119 return NGX_CHAIN_ERROR;
120 }
121 113
122 sfv->sfv_fd = SFV_FD_SELF; 114 sfv->sfv_fd = SFV_FD_SELF;
123 sfv->sfv_flag = 0; 115 sfv->sfv_flag = 0;
124 sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos; 116 sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos;
125 sfv->sfv_len = (size_t) size; 117 sfv->sfv_len = (size_t) size;
146 138
147 if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { 139 if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) {
148 sfv->sfv_len += (size_t) size; 140 sfv->sfv_len += (size_t) size;
149 141
150 } else { 142 } else {
151 if (vec.nelts >= IOV_MAX) { 143 if (nsfv == NGX_SENDFILEVECS) {
152 break; 144 break;
153 } 145 }
154 146
155 sfv = ngx_array_push(&vec); 147 sfv = &sfvs[nsfv++];
156 if (sfv == NULL) {
157 return NGX_CHAIN_ERROR;
158 }
159 148
160 fd = cl->buf->file->fd; 149 fd = cl->buf->file->fd;
161 sfv->sfv_fd = fd; 150 sfv->sfv_fd = fd;
162 sfv->sfv_flag = 0; 151 sfv->sfv_flag = 0;
163 sfv->sfv_off = cl->buf->file_pos; 152 sfv->sfv_off = cl->buf->file_pos;
167 fprev = cl->buf->file_pos + size; 156 fprev = cl->buf->file_pos + size;
168 send += size; 157 send += size;
169 } 158 }
170 } 159 }
171 160
172 n = sendfilev(c->fd, vec.elts, vec.nelts, &sent); 161 n = sendfilev(c->fd, sfvs, nsfv, &sent);
173 162
174 if (n == -1) { 163 if (n == -1) {
175 err = ngx_errno; 164 err = ngx_errno;
176 165
177 switch (err) { 166 switch (err) {