Mercurial > hg > nginx
comparison src/os/unix/ngx_solaris_sendfilev_chain.c @ 5914:4dd67e5d958e
Refactored ngx_solaris_sendfilev_chain().
Though ngx_solaris_sendfilev_chain() shouldn't suffer from the problem mentioned
in d1bde5c3c5d2 since currently IOV_MAX on Solaris is 16, but this follows the
change from 3d5717550371 in order to make the code look similar to other systems
and potentially eliminates the problem in the future.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Wed, 19 Nov 2014 21:17:11 +0300 |
parents | de68ed551bfb |
children | 646985c55393 |
comparison
equal
deleted
inserted
replaced
5913:8e903522c17a | 5914:4dd67e5d958e |
---|---|
46 off_t size, send, prev_send, aligned, fprev; | 46 off_t size, send, prev_send, aligned, fprev; |
47 size_t sent; | 47 size_t sent; |
48 ssize_t n; | 48 ssize_t n; |
49 ngx_int_t eintr; | 49 ngx_int_t eintr; |
50 ngx_err_t err; | 50 ngx_err_t err; |
51 ngx_uint_t nsfv; | |
51 sendfilevec_t *sfv, sfvs[NGX_SENDFILEVECS]; | 52 sendfilevec_t *sfv, sfvs[NGX_SENDFILEVECS]; |
52 ngx_array_t vec; | |
53 ngx_event_t *wev; | 53 ngx_event_t *wev; |
54 ngx_chain_t *cl; | 54 ngx_chain_t *cl; |
55 | 55 |
56 wev = c->write; | 56 wev = c->write; |
57 | 57 |
70 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; | 70 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; |
71 } | 71 } |
72 | 72 |
73 | 73 |
74 send = 0; | 74 send = 0; |
75 | |
76 vec.elts = sfvs; | |
77 vec.size = sizeof(sendfilevec_t); | |
78 vec.nalloc = NGX_SENDFILEVECS; | |
79 vec.pool = c->pool; | |
80 | 75 |
81 for ( ;; ) { | 76 for ( ;; ) { |
82 fd = SFV_FD_SELF; | 77 fd = SFV_FD_SELF; |
83 prev = NULL; | 78 prev = NULL; |
84 fprev = 0; | 79 fprev = 0; |
85 sfv = NULL; | 80 sfv = NULL; |
86 eintr = 0; | 81 eintr = 0; |
87 sent = 0; | 82 sent = 0; |
88 prev_send = send; | 83 prev_send = send; |
89 | 84 |
90 vec.nelts = 0; | 85 nsfv = 0; |
91 | 86 |
92 /* create the sendfilevec and coalesce the neighbouring bufs */ | 87 /* create the sendfilevec and coalesce the neighbouring bufs */ |
93 | 88 |
94 for (cl = in; cl && send < limit; cl = cl->next) { | 89 for (cl = in; cl && send < limit; cl = cl->next) { |
95 | 90 |
108 | 103 |
109 if (prev == cl->buf->pos) { | 104 if (prev == cl->buf->pos) { |
110 sfv->sfv_len += (size_t) size; | 105 sfv->sfv_len += (size_t) size; |
111 | 106 |
112 } else { | 107 } else { |
113 if (vec.nelts >= IOV_MAX) { | 108 if (nsfv == NGX_SENDFILEVECS) { |
114 break; | 109 break; |
115 } | 110 } |
116 | 111 |
117 sfv = ngx_array_push(&vec); | 112 sfv = &sfvs[nsfv++]; |
118 if (sfv == NULL) { | |
119 return NGX_CHAIN_ERROR; | |
120 } | |
121 | 113 |
122 sfv->sfv_fd = SFV_FD_SELF; | 114 sfv->sfv_fd = SFV_FD_SELF; |
123 sfv->sfv_flag = 0; | 115 sfv->sfv_flag = 0; |
124 sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos; | 116 sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos; |
125 sfv->sfv_len = (size_t) size; | 117 sfv->sfv_len = (size_t) size; |
146 | 138 |
147 if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { | 139 if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { |
148 sfv->sfv_len += (size_t) size; | 140 sfv->sfv_len += (size_t) size; |
149 | 141 |
150 } else { | 142 } else { |
151 if (vec.nelts >= IOV_MAX) { | 143 if (nsfv == NGX_SENDFILEVECS) { |
152 break; | 144 break; |
153 } | 145 } |
154 | 146 |
155 sfv = ngx_array_push(&vec); | 147 sfv = &sfvs[nsfv++]; |
156 if (sfv == NULL) { | |
157 return NGX_CHAIN_ERROR; | |
158 } | |
159 | 148 |
160 fd = cl->buf->file->fd; | 149 fd = cl->buf->file->fd; |
161 sfv->sfv_fd = fd; | 150 sfv->sfv_fd = fd; |
162 sfv->sfv_flag = 0; | 151 sfv->sfv_flag = 0; |
163 sfv->sfv_off = cl->buf->file_pos; | 152 sfv->sfv_off = cl->buf->file_pos; |
167 fprev = cl->buf->file_pos + size; | 156 fprev = cl->buf->file_pos + size; |
168 send += size; | 157 send += size; |
169 } | 158 } |
170 } | 159 } |
171 | 160 |
172 n = sendfilev(c->fd, vec.elts, vec.nelts, &sent); | 161 n = sendfilev(c->fd, sfvs, nsfv, &sent); |
173 | 162 |
174 if (n == -1) { | 163 if (n == -1) { |
175 err = ngx_errno; | 164 err = ngx_errno; |
176 | 165 |
177 switch (err) { | 166 switch (err) { |