Mercurial > hg > nginx
comparison src/os/unix/ngx_files.c @ 6301:b5a87b51be24
Used the pwritev() syscall for writing files where possible.
It is more effective, because it doesn't require a separate lseek().
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Tue, 17 Nov 2015 19:01:41 +0300 |
parents | be6af0906a4d |
children | 3832b608dc8d |
comparison
equal
deleted
inserted
replaced
6300:be6af0906a4d | 6301:b5a87b51be24 |
---|---|
365 ngx_writev_file(ngx_file_t *file, ngx_array_t *vec, size_t size, off_t offset) | 365 ngx_writev_file(ngx_file_t *file, ngx_array_t *vec, size_t size, off_t offset) |
366 { | 366 { |
367 ssize_t n; | 367 ssize_t n; |
368 ngx_err_t err; | 368 ngx_err_t err; |
369 | 369 |
370 ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0, | |
371 "writev: %d, %uz, %O", file->fd, size, offset); | |
372 | |
373 #if (NGX_HAVE_PWRITEV) | |
374 | |
375 eintr: | |
376 | |
377 n = pwritev(file->fd, vec->elts, vec->nelts, offset); | |
378 | |
379 if (n == -1) { | |
380 err = ngx_errno; | |
381 | |
382 if (err == NGX_EINTR) { | |
383 ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, | |
384 "pwritev() was interrupted"); | |
385 goto eintr; | |
386 } | |
387 | |
388 ngx_log_error(NGX_LOG_CRIT, file->log, err, | |
389 "pwritev() \"%s\" failed", file->name.data); | |
390 return NGX_ERROR; | |
391 } | |
392 | |
393 if ((size_t) n != size) { | |
394 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | |
395 "pwritev() \"%s\" has written only %z of %uz", | |
396 file->name.data, n, size); | |
397 return NGX_ERROR; | |
398 } | |
399 | |
400 #else | |
401 | |
370 if (file->sys_offset != offset) { | 402 if (file->sys_offset != offset) { |
371 if (lseek(file->fd, offset, SEEK_SET) == -1) { | 403 if (lseek(file->fd, offset, SEEK_SET) == -1) { |
372 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 404 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
373 "lseek() \"%s\" failed", file->name.data); | 405 "lseek() \"%s\" failed", file->name.data); |
374 return NGX_ERROR; | 406 return NGX_ERROR; |
400 "writev() \"%s\" has written only %z of %uz", | 432 "writev() \"%s\" has written only %z of %uz", |
401 file->name.data, n, size); | 433 file->name.data, n, size); |
402 return NGX_ERROR; | 434 return NGX_ERROR; |
403 } | 435 } |
404 | 436 |
405 ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, | |
406 "writev: %d, %z", file->fd, n); | |
407 | |
408 file->sys_offset += n; | 437 file->sys_offset += n; |
438 | |
439 #endif | |
440 | |
409 file->offset += n; | 441 file->offset += n; |
410 | 442 |
411 return n; | 443 return n; |
412 } | 444 } |
413 | 445 |