Mercurial > hg > nginx
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) |