Mercurial > hg > nginx
comparison src/os/unix/ngx_freebsd_sendfile_chain.c @ 5917:2c64b69daec5
Moved writev() handling code to a separate function.
This reduces code duplication and unifies debug logging of the writev() syscall
among various send chain functions.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Wed, 13 Aug 2014 15:11:45 +0400 |
parents | e044893b4587 |
children | ccad84a174e0 |
comparison
equal
deleted
inserted
replaced
5916:e044893b4587 | 5917:2c64b69daec5 |
---|---|
33 ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) | 33 ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) |
34 { | 34 { |
35 int rc, flags; | 35 int rc, flags; |
36 off_t send, prev_send, sent; | 36 off_t send, prev_send, sent; |
37 size_t file_size; | 37 size_t file_size; |
38 ssize_t n; | |
38 ngx_uint_t eintr, eagain; | 39 ngx_uint_t eintr, eagain; |
39 ngx_err_t err; | 40 ngx_err_t err; |
40 ngx_buf_t *file; | 41 ngx_buf_t *file; |
41 ngx_event_t *wev; | 42 ngx_event_t *wev; |
42 ngx_chain_t *cl; | 43 ngx_chain_t *cl; |
215 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, | 216 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, |
216 "sendfile: %d, @%O %O:%uz", | 217 "sendfile: %d, @%O %O:%uz", |
217 rc, file->file_pos, sent, file_size + header.size); | 218 rc, file->file_pos, sent, file_size + header.size); |
218 | 219 |
219 } else { | 220 } else { |
220 rc = writev(c->fd, header.iovs, header.count); | 221 n = ngx_writev(c, &header); |
221 | 222 |
222 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, | 223 if (n == NGX_ERROR) { |
223 "writev: %d of %uz", rc, header.size); | 224 return NGX_CHAIN_ERROR; |
224 | 225 } |
225 if (rc == -1) { | 226 |
226 err = ngx_errno; | 227 sent = (n == NGX_AGAIN) ? 0 : n; |
227 | |
228 switch (err) { | |
229 case NGX_EAGAIN: | |
230 break; | |
231 | |
232 case NGX_EINTR: | |
233 eintr = 1; | |
234 break; | |
235 | |
236 default: | |
237 wev->error = 1; | |
238 ngx_connection_error(c, err, "writev() failed"); | |
239 return NGX_CHAIN_ERROR; | |
240 } | |
241 | |
242 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, | |
243 "writev() not ready"); | |
244 } | |
245 | |
246 sent = rc > 0 ? rc : 0; | |
247 } | 228 } |
248 | 229 |
249 c->sent += sent; | 230 c->sent += sent; |
250 | 231 |
251 in = ngx_chain_update_sent(in, sent); | 232 in = ngx_chain_update_sent(in, sent); |