Mercurial > hg > nginx
comparison src/event/modules/ngx_iocp_module.c @ 461:a88a3e4e158f release-0.1.5
nginx-0.1.5-RELEASE import
*) Bugfix: on Solaris and Linux there may be too many "recvmsg()
returned not enough data" alerts.
*) Bugfix: there were the "writev() failed (22: Invalid argument)"
errors on Solaris in proxy mode without sendfile. On other platforms
that do not support sendfile at all the process got caught in an
endless loop.
*) Bugfix: segmentation fault on Solaris in proxy mode and using
sendfile.
*) Bugfix: segmentation fault on Solaris.
*) Bugfix: on-line upgrade did not work on Linux.
*) Bugfix: the ngx_http_autoindex_module module did not escape the
spaces, the quotes, and the percent signs in the directory listing.
*) Change: the decrease of the copy operations.
*) Feature: the userid_p3p directive.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 11 Nov 2004 14:07:14 +0000 |
parents | 42d11f017717 |
children | d4ea69372b94 |
comparison
equal
deleted
inserted
replaced
460:5f8319142dfc | 461:a88a3e4e158f |
---|---|
80 | 80 |
81 ngx_os_io_t ngx_iocp_io = { | 81 ngx_os_io_t ngx_iocp_io = { |
82 ngx_overlapped_wsarecv, | 82 ngx_overlapped_wsarecv, |
83 NULL, | 83 NULL, |
84 NULL, | 84 NULL, |
85 ngx_wsasend_chain, | 85 ngx_overlapped_wsasend_chain, |
86 0 | 86 0 |
87 }; | 87 }; |
88 | 88 |
89 | 89 |
90 static HANDLE iocp; | 90 static HANDLE iocp; |
136 | 136 |
137 c->read->active = 1; | 137 c->read->active = 1; |
138 c->write->active = 1; | 138 c->write->active = 1; |
139 | 139 |
140 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 140 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
141 "iocp add: fd:%d k:%d ov:" PTR_FMT, c->fd, key, &ev->ovlp); | 141 "iocp add: fd:%d k:%d ov:%p", c->fd, key, &ev->ovlp); |
142 | 142 |
143 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) { | 143 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) { |
144 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | 144 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, |
145 "CreateIoCompletionPort() failed"); | 145 "CreateIoCompletionPort() failed"); |
146 return NGX_ERROR; | 146 return NGX_ERROR; |
150 } | 150 } |
151 | 151 |
152 | 152 |
153 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags) | 153 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags) |
154 { | 154 { |
155 #if 0 | |
156 if (flags & NGX_CLOSE_EVENT) { | |
157 return NGX_OK; | |
158 } | |
159 | |
155 if (CancelIo((HANDLE) c->fd) == 0) { | 160 if (CancelIo((HANDLE) c->fd) == 0) { |
156 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed"); | 161 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed"); |
157 return NGX_ERROR; | 162 return NGX_ERROR; |
158 } | 163 } |
164 #endif | |
159 | 165 |
160 return NGX_OK; | 166 return NGX_OK; |
161 } | 167 } |
162 | 168 |
163 | 169 |
193 | 199 |
194 ngx_gettimeofday(&tv); | 200 ngx_gettimeofday(&tv); |
195 ngx_time_update(tv.tv_sec); | 201 ngx_time_update(tv.tv_sec); |
196 | 202 |
197 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 203 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
198 "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp); | 204 "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp); |
199 | 205 |
200 delta = ngx_elapsed_msec; | 206 delta = ngx_elapsed_msec; |
201 ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 | 207 ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 |
202 + tv.tv_usec / 1000 - ngx_start_msec; | 208 + tv.tv_usec / 1000 - ngx_start_msec; |
209 | |
210 if (timer != INFINITE) { | |
211 delta = ngx_elapsed_msec - delta; | |
212 | |
213 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
214 "iocp timer: %d, delta: %d", timer, (int) delta); | |
215 } | |
203 | 216 |
204 if (err) { | 217 if (err) { |
205 if (ovlp == NULL) { | 218 if (ovlp == NULL) { |
206 if (err != WAIT_TIMEOUT) { | 219 if (err != WAIT_TIMEOUT) { |
207 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, | 220 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, |
208 "GetQueuedCompletionStatus() failed"); | 221 "GetQueuedCompletionStatus() failed"); |
209 | 222 |
210 return NGX_ERROR; | 223 return NGX_ERROR; |
211 } | 224 } |
212 | 225 |
213 } else { | 226 if (timer != INFINITE && delta) { |
214 ovlp->error = err; | 227 ngx_event_expire_timers((ngx_msec_t) delta); |
228 } | |
229 | |
230 return NGX_OK; | |
215 } | 231 } |
216 } | 232 |
217 | 233 ovlp->error = err; |
218 if (timer != INFINITE) { | 234 } |
219 delta = ngx_elapsed_msec - delta; | 235 |
220 | 236 if (ovlp == NULL) { |
221 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 237 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
222 "iocp timer: %d, delta: %d", timer, (int) delta); | 238 "GetQueuedCompletionStatus() returned no operation"); |
223 } | 239 return NGX_ERROR; |
224 | 240 } |
225 if (ovlp) { | 241 |
226 ev = ovlp->event; | 242 |
227 | 243 ev = ovlp->event; |
228 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 244 |
229 "iocp event:" PTR_FMT, ev); | 245 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, "iocp event:%p", ev); |
230 | 246 |
231 switch (key) { | 247 |
232 | 248 if (err == ERROR_NETNAME_DELETED /* the socket was closed */ |
233 case NGX_IOCP_ACCEPT: | 249 || err == ERROR_OPERATION_ABORTED /* the operation was canceled */) |
234 if (bytes) { | 250 { |
235 ev->ready = 1; | 251 |
236 } | 252 /* |
237 break; | 253 * the WSA_OPERATION_ABORTED completion notification |
238 | 254 * for a file descriptor that was closed |
239 case NGX_IOCP_IO: | 255 */ |
240 ev->complete = 1; | 256 |
241 ev->ready = 1; | 257 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, |
242 break; | 258 "iocp: aborted event %p", ev); |
243 | 259 |
244 case NGX_IOCP_CONNECT: | 260 if (timer != INFINITE && delta) { |
261 ngx_event_expire_timers((ngx_msec_t) delta); | |
262 } | |
263 | |
264 return NGX_OK; | |
265 } | |
266 | |
267 if (err) { | |
268 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, | |
269 "GetQueuedCompletionStatus() returned operation error"); | |
270 } | |
271 | |
272 switch (key) { | |
273 | |
274 case NGX_IOCP_ACCEPT: | |
275 if (bytes) { | |
245 ev->ready = 1; | 276 ev->ready = 1; |
246 } | 277 } |
247 | 278 break; |
248 ev->available = bytes; | 279 |
249 | 280 case NGX_IOCP_IO: |
250 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 281 ev->complete = 1; |
251 "iocp event handler: " PTR_FMT, ev->event_handler); | 282 ev->ready = 1; |
252 | 283 break; |
253 ev->event_handler(ev); | 284 |
254 } | 285 case NGX_IOCP_CONNECT: |
286 ev->ready = 1; | |
287 } | |
288 | |
289 ev->available = bytes; | |
290 | |
291 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
292 "iocp event handler: %p", ev->event_handler); | |
293 | |
294 ev->event_handler(ev); | |
255 | 295 |
256 if (timer != INFINITE && delta) { | 296 if (timer != INFINITE && delta) { |
257 ngx_event_expire_timers((ngx_msec_t) delta); | 297 ngx_event_expire_timers((ngx_msec_t) delta); |
258 } | 298 } |
259 | 299 |