Mercurial > hg > nginx
comparison src/os/unix/ngx_writev_chain.c @ 257:70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 11 Feb 2004 17:08:49 +0000 |
parents | 34995c5ec6c4 |
children | 87e73f067470 |
comparison
equal
deleted
inserted
replaced
256:8e39cab6abd5 | 257:70e1c7d2b83d |
---|---|
19 wev = c->write; | 19 wev = c->write; |
20 | 20 |
21 if (!wev->ready) { | 21 if (!wev->ready) { |
22 return in; | 22 return in; |
23 } | 23 } |
24 | |
25 #if (HAVE_KQUEUE) | |
26 | |
27 if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) && wev->kq_eof) { | |
28 ngx_log_error(NGX_LOG_INFO, c->log, wev->kq_errno, | |
29 "kevent() reported about an closed connection"); | |
30 | |
31 wev->error = 1; | |
32 return NGX_CHAIN_ERROR; | |
33 } | |
34 | |
35 #endif | |
24 | 36 |
25 ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR); | 37 ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR); |
26 | 38 |
27 do { | 39 do { |
28 prev = NULL; | 40 prev = NULL; |
47 | 59 |
48 n = writev(c->fd, io.elts, io.nelts); | 60 n = writev(c->fd, io.elts, io.nelts); |
49 | 61 |
50 if (n == -1) { | 62 if (n == -1) { |
51 err = ngx_errno; | 63 err = ngx_errno; |
52 if (err == NGX_EAGAIN) { | |
53 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN"); | |
54 | 64 |
55 } else if (err == NGX_EINTR) { | 65 if (err == NGX_EAGAIN || err == NGX_EINTR) { |
56 eintr = 1; | 66 if (err == NGX_EINTR) { |
57 ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR"); | 67 eintr = 1; |
68 } | |
69 | |
70 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, | |
71 "writev() not ready"); | |
58 | 72 |
59 } else { | 73 } else { |
60 wev->error = 1; | 74 wev->error = 1; |
61 ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed"); | 75 ngx_connection_error(c, err, "writev() failed"); |
62 return NGX_CHAIN_ERROR; | 76 return NGX_CHAIN_ERROR; |
63 } | 77 } |
64 } | 78 } |
65 | 79 |
66 sent = n > 0 ? n : 0; | 80 sent = n > 0 ? n : 0; |
67 | 81 |
68 #if (NGX_DEBUG_WRITE_CHAIN) | 82 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
69 ngx_log_debug(c->log, "writev: " OFF_T_FMT _ sent); | 83 "writev: " OFF_T_FMT, sent); |
70 #endif | |
71 | 84 |
72 c->sent += sent; | 85 c->sent += sent; |
73 | 86 |
74 for (cl = in; cl && sent > 0; cl = cl->next) { | 87 for (cl = in; cl && sent > 0; cl = cl->next) { |
75 | 88 |
76 size = cl->hunk->last - cl->hunk->pos; | 89 size = cl->hunk->last - cl->hunk->pos; |
77 | |
78 ngx_log_debug(c->log, "SIZE: %d" _ size); | |
79 | 90 |
80 if (sent >= size) { | 91 if (sent >= size) { |
81 sent -= size; | 92 sent -= size; |
82 | 93 |
83 if (cl->hunk->type & NGX_HUNK_IN_MEMORY) { | 94 if (cl->hunk->type & NGX_HUNK_IN_MEMORY) { |