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