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 }