Mercurial > hg > nginx-quic
comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 170:c42be4185301
nginx-0.0.1-2003-11-03-01:56:18 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 02 Nov 2003 22:56:18 +0000 |
parents | fb61ba77beba |
children | 4c698194c56d |
comparison
equal
deleted
inserted
replaced
169:edf29bb717da | 170:c42be4185301 |
---|---|
29 ssize_t hsize, fsize, size; | 29 ssize_t hsize, fsize, size; |
30 struct iovec *iov; | 30 struct iovec *iov; |
31 struct sf_hdtr hdtr; | 31 struct sf_hdtr hdtr; |
32 ngx_err_t err; | 32 ngx_err_t err; |
33 ngx_array_t header, trailer; | 33 ngx_array_t header, trailer; |
34 ngx_event_t *wev; | |
34 ngx_hunk_t *file; | 35 ngx_hunk_t *file; |
35 ngx_chain_t *cl, *tail; | 36 ngx_chain_t *cl, *tail; |
36 | 37 |
37 if (!c->write->ready) { | 38 wev = c->write; |
39 | |
40 if (!wev->ready) { | |
38 return in; | 41 return in; |
39 } | 42 } |
43 | |
44 #if (HAVE_KQUEUE) | |
45 | |
46 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) && wev->kq_eof) { | |
47 ngx_log_error(NGX_LOG_ERR, c->log, wev->kq_errno, | |
48 "kevent() reported about closed connection"); | |
49 | |
50 wev->error = 1; | |
51 return NGX_CHAIN_ERROR; | |
52 } | |
53 | |
54 #endif | |
40 | 55 |
41 do { | 56 do { |
42 cl = in; | 57 cl = in; |
43 file = NULL; | 58 file = NULL; |
44 fsize = 0; | 59 fsize = 0; |
179 if (err == NGX_EAGAIN || err == NGX_EINTR) { | 194 if (err == NGX_EAGAIN || err == NGX_EINTR) { |
180 ngx_log_error(NGX_LOG_INFO, c->log, err, | 195 ngx_log_error(NGX_LOG_INFO, c->log, err, |
181 "sendfile() sent only %qd bytes", sent); | 196 "sendfile() sent only %qd bytes", sent); |
182 | 197 |
183 } else { | 198 } else { |
184 c->write->error = 1; | 199 wev->error = 1; |
185 ngx_log_error(NGX_LOG_CRIT, c->log, err, | 200 ngx_log_error(NGX_LOG_CRIT, c->log, err, |
186 "sendfile() failed"); | 201 "sendfile() failed"); |
187 return NGX_CHAIN_ERROR; | 202 return NGX_CHAIN_ERROR; |
188 } | 203 } |
189 } | 204 } |
192 ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _ | 207 ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _ |
193 rc _ file->file_pos _ sent _ fsize + hsize); | 208 rc _ file->file_pos _ sent _ fsize + hsize); |
194 #endif | 209 #endif |
195 | 210 |
196 } else { | 211 } else { |
197 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts); | 212 rc = writev(c->fd, header.elts, header.nelts); |
198 | 213 |
199 if (rc == -1) { | 214 if (rc == -1) { |
200 err = ngx_errno; | 215 err = ngx_errno; |
201 if (err == NGX_EAGAIN) { | 216 if (err == NGX_EAGAIN) { |
202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); | 217 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); |
204 } else if (err == NGX_EINTR) { | 219 } else if (err == NGX_EINTR) { |
205 eintr = 1; | 220 eintr = 1; |
206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); | 221 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); |
207 | 222 |
208 } else { | 223 } else { |
209 c->write->error = 1; | 224 wev->error = 1; |
210 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); | 225 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); |
211 return NGX_CHAIN_ERROR; | 226 return NGX_CHAIN_ERROR; |
212 } | 227 } |
213 } | 228 } |
214 | 229 |
266 * sendfile() can return EAGAIN even if it has sent | 281 * sendfile() can return EAGAIN even if it has sent |
267 * a whole file part and successive sendfile() would | 282 * a whole file part and successive sendfile() would |
268 * return EAGAIN right away and would not send anything | 283 * return EAGAIN right away and would not send anything |
269 */ | 284 */ |
270 | 285 |
271 c->write->ready = 0; | 286 wev->ready = 0; |
272 break; | 287 break; |
273 } | 288 } |
274 | 289 |
275 /* "tail == in" means that a single sendfile() is complete */ | 290 /* "tail == in" means that a single sendfile() is complete */ |
276 | 291 |
277 } while ((tail && tail == in) || eintr); | 292 } while ((tail && tail == in) || eintr); |
278 | 293 |
279 if (in) { | 294 if (in) { |
280 c->write->ready = 0; | 295 wev->ready = 0; |
281 } | 296 } |
282 | 297 |
283 return in; | 298 return in; |
284 } | 299 } |