comparison src/os/unix/ngx_freebsd_sendfile_chain.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 fb61ba77beba
children 4c698194c56d
comparison
equal deleted inserted replaced
169:edf29bb717da 170:c42be4185301
29 ssize_t hsize, fsize, size; 29 ssize_t hsize, fsize, size;
30 struct iovec *iov; 30 struct iovec *iov;
31 struct sf_hdtr hdtr; 31 struct sf_hdtr hdtr;
32 ngx_err_t err; 32 ngx_err_t err;
33 ngx_array_t header, trailer; 33 ngx_array_t header, trailer;
34 ngx_event_t *wev;
34 ngx_hunk_t *file; 35 ngx_hunk_t *file;
35 ngx_chain_t *cl, *tail; 36 ngx_chain_t *cl, *tail;
36 37
37 if (!c->write->ready) { 38 wev = c->write;
39
40 if (!wev->ready) {
38 return in; 41 return in;
39 } 42 }
43
44 #if (HAVE_KQUEUE)
45
46 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) && wev->kq_eof) {
47 ngx_log_error(NGX_LOG_ERR, c->log, wev->kq_errno,
48 "kevent() reported about closed connection");
49
50 wev->error = 1;
51 return NGX_CHAIN_ERROR;
52 }
53
54 #endif
40 55
41 do { 56 do {
42 cl = in; 57 cl = in;
43 file = NULL; 58 file = NULL;
44 fsize = 0; 59 fsize = 0;
179 if (err == NGX_EAGAIN || err == NGX_EINTR) { 194 if (err == NGX_EAGAIN || err == NGX_EINTR) {
180 ngx_log_error(NGX_LOG_INFO, c->log, err, 195 ngx_log_error(NGX_LOG_INFO, c->log, err,
181 "sendfile() sent only %qd bytes", sent); 196 "sendfile() sent only %qd bytes", sent);
182 197
183 } else { 198 } else {
184 c->write->error = 1; 199 wev->error = 1;
185 ngx_log_error(NGX_LOG_CRIT, c->log, err, 200 ngx_log_error(NGX_LOG_CRIT, c->log, err,
186 "sendfile() failed"); 201 "sendfile() failed");
187 return NGX_CHAIN_ERROR; 202 return NGX_CHAIN_ERROR;
188 } 203 }
189 } 204 }
192 ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _ 207 ngx_log_debug(c->log, "sendfile: %d, @%qd %qd:%d" _
193 rc _ file->file_pos _ sent _ fsize + hsize); 208 rc _ file->file_pos _ sent _ fsize + hsize);
194 #endif 209 #endif
195 210
196 } else { 211 } else {
197 rc = writev(c->fd, (struct iovec *) header.elts, header.nelts); 212 rc = writev(c->fd, header.elts, header.nelts);
198 213
199 if (rc == -1) { 214 if (rc == -1) {
200 err = ngx_errno; 215 err = ngx_errno;
201 if (err == NGX_EAGAIN) { 216 if (err == NGX_EAGAIN) {
202 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); 217 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN");
204 } else if (err == NGX_EINTR) { 219 } else if (err == NGX_EINTR) {
205 eintr = 1; 220 eintr = 1;
206 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); 221 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR");
207 222
208 } else { 223 } else {
209 c->write->error = 1; 224 wev->error = 1;
210 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); 225 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed");
211 return NGX_CHAIN_ERROR; 226 return NGX_CHAIN_ERROR;
212 } 227 }
213 } 228 }
214 229
266 * sendfile() can return EAGAIN even if it has sent 281 * sendfile() can return EAGAIN even if it has sent
267 * a whole file part and successive sendfile() would 282 * a whole file part and successive sendfile() would
268 * return EAGAIN right away and would not send anything 283 * return EAGAIN right away and would not send anything
269 */ 284 */
270 285
271 c->write->ready = 0; 286 wev->ready = 0;
272 break; 287 break;
273 } 288 }
274 289
275 /* "tail == in" means that a single sendfile() is complete */ 290 /* "tail == in" means that a single sendfile() is complete */
276 291
277 } while ((tail && tail == in) || eintr); 292 } while ((tail && tail == in) || eintr);
278 293
279 if (in) { 294 if (in) {
280 c->write->ready = 0; 295 wev->ready = 0;
281 } 296 }
282 297
283 return in; 298 return in;
284 } 299 }