Mercurial > hg > nginx
comparison src/os/unix/ngx_readv_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 | 0061d1f0908d |
children | 87e73f067470 |
comparison
equal
deleted
inserted
replaced
256:8e39cab6abd5 | 257:70e1c7d2b83d |
---|---|
1 | 1 |
2 #include <ngx_config.h> | 2 #include <ngx_config.h> |
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_event.h> | 4 #include <ngx_event.h> |
5 | 5 |
6 | |
7 static int ngx_readv_error(ngx_event_t *rev, ngx_err_t err); | |
8 | 6 |
9 #if (HAVE_KQUEUE) | 7 #if (HAVE_KQUEUE) |
10 | 8 |
11 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) | 9 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) |
12 { | 10 { |
18 ngx_event_t *rev; | 16 ngx_event_t *rev; |
19 | 17 |
20 rev = c->read; | 18 rev = c->read; |
21 | 19 |
22 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 20 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
23 ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _ | 21 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
24 rev->kq_eof _ rev->available _ rev->kq_errno); | 22 "readv: eof:%d, avail:%d, err:%d", |
23 rev->kq_eof, rev->available, rev->kq_errno); | |
25 | 24 |
26 if (rev->available == 0) { | 25 if (rev->available == 0) { |
27 if (rev->kq_eof) { | 26 if (rev->kq_eof) { |
28 rev->ready = 0; | 27 rev->ready = 0; |
29 rev->eof = 1; | 28 rev->eof = 1; |
30 | 29 |
30 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, | |
31 "kevent() reported about an closed connection"); | |
32 | |
31 if (rev->kq_errno) { | 33 if (rev->kq_errno) { |
32 rev->error = 1; | 34 rev->error = 1; |
33 ngx_set_socket_errno(rev->kq_errno); | 35 ngx_set_socket_errno(rev->kq_errno); |
34 return ngx_readv_error(rev, rev->kq_errno); | 36 return NGX_ERROR; |
35 } | 37 } |
36 | 38 |
37 return 0; | 39 return 0; |
38 | 40 |
39 } else { | 41 } else { |
63 size += chain->hunk->end - chain->hunk->last; | 65 size += chain->hunk->end - chain->hunk->last; |
64 prev = chain->hunk->end; | 66 prev = chain->hunk->end; |
65 chain = chain->next; | 67 chain = chain->next; |
66 } | 68 } |
67 | 69 |
68 ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len); | 70 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
71 "readv: %d:%d", io.nelts, iov->iov_len); | |
69 | 72 |
70 rev = c->read; | 73 rev = c->read; |
71 | 74 |
72 do { | 75 do { |
73 n = readv(c->fd, (struct iovec *) io.elts, io.nelts); | 76 n = readv(c->fd, (struct iovec *) io.elts, io.nelts); |
103 } | 106 } |
104 | 107 |
105 return n; | 108 return n; |
106 } | 109 } |
107 | 110 |
108 n = ngx_readv_error(rev, ngx_socket_errno); | 111 err = ngx_socket_errno; |
109 | 112 |
110 } while (n == NGX_EINTR); | 113 if (err == NGX_EAGAIN || err == NGX_EINTR) { |
111 | 114 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, |
112 /* NGX_ERROR || NGX_AGAIN */ | 115 "readv() not ready"); |
116 n = NGX_AGAIN; | |
117 | |
118 } else { | |
119 n = ngx_connection_error(c, err, "readv() failed"); | |
120 break; | |
121 } | |
122 | |
123 } while (err == NGX_EINTR); | |
113 | 124 |
114 rev->ready = 0; | 125 rev->ready = 0; |
115 | 126 |
116 if (n == NGX_ERROR){ | 127 if (n == NGX_ERROR){ |
117 c->read->error = 1; | 128 c->read->error = 1; |
152 size += chain->hunk->end - chain->hunk->last; | 163 size += chain->hunk->end - chain->hunk->last; |
153 prev = chain->hunk->end; | 164 prev = chain->hunk->end; |
154 chain = chain->next; | 165 chain = chain->next; |
155 } | 166 } |
156 | 167 |
157 ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len); | 168 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |
169 "readv: %d:%d", io.nelts, iov->iov_len); | |
158 | 170 |
159 rev = c->read; | 171 rev = c->read; |
160 | 172 |
161 do { | 173 do { |
162 n = readv(c->fd, (struct iovec *) io.elts, io.nelts); | 174 n = readv(c->fd, (struct iovec *) io.elts, io.nelts); |
171 } | 183 } |
172 | 184 |
173 return n; | 185 return n; |
174 } | 186 } |
175 | 187 |
176 n = ngx_readv_error(rev, ngx_socket_errno); | 188 err = ngx_socket_errno; |
177 | 189 |
178 } while (n == NGX_EINTR); | 190 if (err == NGX_EAGAIN || err == NGX_EINTR) { |
179 | 191 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, |
180 /* NGX_ERROR || NGX_AGAIN */ | 192 "readv() not ready"); |
193 n = NGX_AGAIN; | |
194 | |
195 } else { | |
196 n = ngx_connection_error(c, err, "readv() failed"); | |
197 break; | |
198 } | |
199 | |
200 } while (err == NGX_EINTR); | |
181 | 201 |
182 rev->ready = 0; | 202 rev->ready = 0; |
183 | 203 |
184 if (n == NGX_ERROR){ | 204 if (n == NGX_ERROR){ |
185 c->read->error = 1; | 205 c->read->error = 1; |
187 | 207 |
188 return n; | 208 return n; |
189 } | 209 } |
190 | 210 |
191 #endif /* NAVE_KQUEUE */ | 211 #endif /* NAVE_KQUEUE */ |
192 | |
193 | |
194 static int ngx_readv_error(ngx_event_t *rev, ngx_err_t err) | |
195 { | |
196 if (err == NGX_EAGAIN) { | |
197 ngx_log_error(NGX_LOG_INFO, rev->log, err, "readv() returned EAGAIN"); | |
198 return NGX_AGAIN; | |
199 } | |
200 | |
201 if (err == NGX_EINTR) { | |
202 ngx_log_error(NGX_LOG_INFO, rev->log, err, "readv() returned EINTR"); | |
203 return NGX_EINTR; | |
204 } | |
205 | |
206 ngx_log_error(NGX_LOG_ERR, rev->log, err, "readv() failed"); | |
207 | |
208 return NGX_ERROR; | |
209 } |