comparison src/os/unix/ngx_files.c @ 170:c42be4185301

nginx-0.0.1-2003-11-03-01:56:18 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 02 Nov 2003 22:56:18 +0000
parents eac26585476e
children 3c49eaf3f522
comparison
equal deleted inserted replaced
169:edf29bb717da 170:c42be4185301
48 48
49 return n; 49 return n;
50 } 50 }
51 51
52 52
53 ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, 53 ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl,
54 off_t offset, ngx_pool_t *pool) 54 off_t offset, ngx_pool_t *pool)
55 { 55 {
56 char *prev;
56 size_t size; 57 size_t size;
57 ssize_t n; 58 ssize_t n;
58 struct iovec *iov; 59 struct iovec *iov;
59 ngx_err_t err; 60 ngx_err_t err;
60 ngx_array_t io; 61 ngx_array_t io;
61 62
62 /* use pwrite() if there's the only hunk in a chain */ 63 /* use pwrite() if there's the only hunk in a chain */
63 64
64 if (ce->next == NULL) { 65 if (cl->next == NULL) {
65 return ngx_write_file(file, ce->hunk->pos, 66 return ngx_write_file(file, cl->hunk->pos,
66 ce->hunk->last - ce->hunk->pos, offset); 67 cl->hunk->last - cl->hunk->pos, offset);
67 } 68 }
68 69
69 ngx_init_array(io, pool, 10, sizeof(struct iovec), NGX_ERROR); 70 prev = NULL;
71 iov = NULL;
70 size = 0; 72 size = 0;
71 73
72 while (ce) { 74 ngx_init_array(io, pool, 10, sizeof(struct iovec), NGX_ERROR);
73 ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR); 75
74 iov->iov_base = ce->hunk->pos; 76 /* create the iovec and coalesce the neighbouring hunks */
75 iov->iov_len = ce->hunk->last - ce->hunk->pos; 77
76 size += ce->hunk->last - ce->hunk->pos; 78 while (cl) {
77 ce = ce->next; 79 if (prev == cl->hunk->pos) {
80 iov->iov_len += cl->hunk->last - cl->hunk->pos;
81
82 } else {
83 ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR);
84 iov->iov_base = cl->hunk->pos;
85 iov->iov_len = cl->hunk->last - cl->hunk->pos;
86 }
87
88 size += cl->hunk->last - cl->hunk->pos;
89 prev = cl->hunk->last;
90 cl = cl->next;
91 }
92
93 /* use pwrite() if there's the only iovec buffer */
94
95 if (io.nelts == 1) {
96 iov = io.elts;
97 return ngx_write_file(file, iov[0].iov_base, iov[0].iov_len, offset);
78 } 98 }
79 99
80 if (file->offset != offset) { 100 if (file->offset != offset) {
81 if (lseek(file->fd, offset, SEEK_SET) == -1) { 101 if (lseek(file->fd, offset, SEEK_SET) == -1) {
82 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); 102 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
83 return NGX_ERROR; 103 return NGX_ERROR;
84 } 104 }
85 } 105 }
86 106
87 n = writev(file->fd, (struct iovec *) io.elts, io.nelts); 107 n = writev(file->fd, io.elts, io.nelts);
88 108
89 if (n == -1) { 109 if (n == -1) {
90 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "writev() failed"); 110 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "writev() failed");
91 return NGX_ERROR; 111 return NGX_ERROR;
92 } 112 }