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);