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