comparison src/os/unix/ngx_files.c @ 6300:be6af0906a4d

Moved file writev() handling code to a separate function. No functional changes.
author Valentin Bartenev <vbart@nginx.com>
date Tue, 17 Nov 2015 19:01:41 +0300
parents 5170c3040ce1
children b5a87b51be24
comparison
equal deleted inserted replaced
6299:5170c3040ce1 6300:be6af0906a4d
11 11
12 #if (NGX_THREADS) 12 #if (NGX_THREADS)
13 #include <ngx_thread_pool.h> 13 #include <ngx_thread_pool.h>
14 static void ngx_thread_read_handler(void *data, ngx_log_t *log); 14 static void ngx_thread_read_handler(void *data, ngx_log_t *log);
15 #endif 15 #endif
16
17 static ssize_t ngx_writev_file(ngx_file_t *file, ngx_array_t *vec, size_t size,
18 off_t offset);
16 19
17 20
18 #if (NGX_HAVE_FILE_AIO) 21 #if (NGX_HAVE_FILE_AIO)
19 22
20 ngx_uint_t ngx_file_aio = 1; 23 ngx_uint_t ngx_file_aio = 1;
280 ngx_pool_t *pool) 283 ngx_pool_t *pool)
281 { 284 {
282 u_char *prev; 285 u_char *prev;
283 size_t size; 286 size_t size;
284 ssize_t total, n; 287 ssize_t total, n;
285 ngx_err_t err;
286 ngx_array_t vec; 288 ngx_array_t vec;
287 struct iovec *iov, iovs[NGX_IOVS]; 289 struct iovec *iov, iovs[NGX_IOVS];
288 290
289 /* use pwrite() if there is the only buf in a chain */ 291 /* use pwrite() if there is the only buf in a chain */
290 292
342 } 344 }
343 345
344 return total + n; 346 return total + n;
345 } 347 }
346 348
347 if (file->sys_offset != offset) { 349 n = ngx_writev_file(file, &vec, size, offset);
348 if (lseek(file->fd, offset, SEEK_SET) == -1) { 350
349 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, 351 if (n == NGX_ERROR) {
350 "lseek() \"%s\" failed", file->name.data); 352 return n;
351 return NGX_ERROR; 353 }
352 } 354
353
354 file->sys_offset = offset;
355 }
356
357 eintr:
358
359 n = writev(file->fd, vec.elts, vec.nelts);
360
361 if (n == -1) {
362 err = ngx_errno;
363
364 if (err == NGX_EINTR) {
365 ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,
366 "writev() was interrupted");
367 goto eintr;
368 }
369
370 ngx_log_error(NGX_LOG_CRIT, file->log, err,
371 "writev() \"%s\" failed", file->name.data);
372 return NGX_ERROR;
373 }
374
375 if ((size_t) n != size) {
376 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
377 "writev() \"%s\" has written only %z of %uz",
378 file->name.data, n, size);
379 return NGX_ERROR;
380 }
381
382 ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
383 "writev: %d, %z", file->fd, n);
384
385 file->sys_offset += n;
386 file->offset += n;
387 offset += n; 355 offset += n;
388 total += n; 356 total += n;
389 357
390 } while (cl); 358 } while (cl);
391 359
392 return total; 360 return total;
361 }
362
363
364 static ssize_t
365 ngx_writev_file(ngx_file_t *file, ngx_array_t *vec, size_t size, off_t offset)
366 {
367 ssize_t n;
368 ngx_err_t err;
369
370 if (file->sys_offset != offset) {
371 if (lseek(file->fd, offset, SEEK_SET) == -1) {
372 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
373 "lseek() \"%s\" failed", file->name.data);
374 return NGX_ERROR;
375 }
376
377 file->sys_offset = offset;
378 }
379
380 eintr:
381
382 n = writev(file->fd, vec->elts, vec->nelts);
383
384 if (n == -1) {
385 err = ngx_errno;
386
387 if (err == NGX_EINTR) {
388 ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err,
389 "writev() was interrupted");
390 goto eintr;
391 }
392
393 ngx_log_error(NGX_LOG_CRIT, file->log, err,
394 "writev() \"%s\" failed", file->name.data);
395 return NGX_ERROR;
396 }
397
398 if ((size_t) n != size) {
399 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
400 "writev() \"%s\" has written only %z of %uz",
401 file->name.data, n, size);
402 return NGX_ERROR;
403 }
404
405 ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
406 "writev: %d, %z", file->fd, n);
407
408 file->sys_offset += n;
409 file->offset += n;
410
411 return n;
393 } 412 }
394 413
395 414
396 ngx_int_t 415 ngx_int_t
397 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) 416 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)