diff options
author | Valentin Bartenev <vbart@nginx.com> | 2015-11-17 19:01:41 +0300 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2015-11-17 19:01:41 +0300 |
commit | d862ae8e6854501c6692e84bd5708150f2a1d9a1 (patch) | |
tree | 5e127d4066ab9ce5b4e8b21079f91bafd06c016c /src/os/unix/ngx_files.c | |
parent | 906c4462f83fb90c8abef5c89f8b689ace83c6af (diff) | |
download | nginx-d862ae8e6854501c6692e84bd5708150f2a1d9a1.tar.gz nginx-d862ae8e6854501c6692e84bd5708150f2a1d9a1.zip |
Used the pwritev() syscall for writing files where possible.
It is more effective, because it doesn't require a separate lseek().
Diffstat (limited to 'src/os/unix/ngx_files.c')
-rw-r--r-- | src/os/unix/ngx_files.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index c95cf257f..00a6a49b6 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -367,6 +367,38 @@ ngx_writev_file(ngx_file_t *file, ngx_array_t *vec, size_t size, off_t offset) ssize_t n; ngx_err_t err; + ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0, + "writev: %d, %uz, %O", file->fd, size, offset); + +#if (NGX_HAVE_PWRITEV) + +eintr: + + n = pwritev(file->fd, vec->elts, vec->nelts, offset); + + if (n == -1) { + err = ngx_errno; + + if (err == NGX_EINTR) { + ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, + "pwritev() was interrupted"); + goto eintr; + } + + ngx_log_error(NGX_LOG_CRIT, file->log, err, + "pwritev() \"%s\" failed", file->name.data); + return NGX_ERROR; + } + + if ((size_t) n != size) { + ngx_log_error(NGX_LOG_CRIT, file->log, 0, + "pwritev() \"%s\" has written only %z of %uz", + file->name.data, n, size); + return NGX_ERROR; + } + +#else + if (file->sys_offset != offset) { if (lseek(file->fd, offset, SEEK_SET) == -1) { ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, @@ -402,10 +434,10 @@ eintr: return NGX_ERROR; } - ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, - "writev: %d, %z", file->fd, n); - file->sys_offset += n; + +#endif + file->offset += n; return n; |