Mercurial > hg > nginx
comparison src/event/modules/ngx_devpoll_module.c @ 1433:8144200f6fa3
add guard code
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 29 Aug 2007 11:26:42 +0000 |
parents | f53e88c49563 |
children | c7d57b539248 |
comparison
equal
deleted
inserted
replaced
1432:f53e88c49563 | 1433:8144200f6fa3 |
---|---|
11 | 11 |
12 #if (NGX_TEST_BUILD_DEVPOLL) | 12 #if (NGX_TEST_BUILD_DEVPOLL) |
13 | 13 |
14 /* Solaris declarations */ | 14 /* Solaris declarations */ |
15 | 15 |
16 #define POLLREMOVE 0x0800 | 16 #define POLLREMOVE 0x0800 |
17 #define DP_POLL 0xD001 | 17 #define DP_POLL 0xD001 |
18 #define DP_ISPOLLED 0xD002 | |
18 | 19 |
19 struct dvpoll { | 20 struct dvpoll { |
20 struct pollfd *dp_fds; | 21 struct pollfd *dp_fds; |
21 int dp_nfds; | 22 int dp_nfds; |
22 int dp_timeout; | 23 int dp_timeout; |
334 | 335 |
335 ngx_int_t | 336 ngx_int_t |
336 ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, | 337 ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, |
337 ngx_uint_t flags) | 338 ngx_uint_t flags) |
338 { | 339 { |
339 int events, revents; | 340 int events, revents, rc; |
340 size_t n; | 341 size_t n; |
342 ngx_fd_t fd; | |
341 ngx_err_t err; | 343 ngx_err_t err; |
342 ngx_int_t i; | 344 ngx_int_t i; |
343 ngx_uint_t level; | 345 ngx_uint_t level; |
344 ngx_event_t *rev, *wev, **queue; | 346 ngx_event_t *rev, *wev, **queue; |
345 ngx_connection_t *c; | 347 ngx_connection_t *c; |
348 struct pollfd pfd; | |
346 struct dvpoll dvp; | 349 struct dvpoll dvp; |
347 | 350 |
348 /* NGX_TIMER_INFINITE == INFTIM */ | 351 /* NGX_TIMER_INFINITE == INFTIM */ |
349 | 352 |
350 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 353 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
405 } | 408 } |
406 | 409 |
407 ngx_mutex_lock(ngx_posted_events_mutex); | 410 ngx_mutex_lock(ngx_posted_events_mutex); |
408 | 411 |
409 for (i = 0; i < events; i++) { | 412 for (i = 0; i < events; i++) { |
410 c = ngx_cycle->files[event_list[i].fd]; | 413 |
411 | 414 fd = event_list[i].fd; |
412 if (c->fd == -1) { | 415 revents = event_list[i].revents; |
413 if (c->read->closed) { | 416 |
414 continue; | 417 c = ngx_cycle->files[fd]; |
415 } | 418 |
416 | 419 if (c == NULL || c->fd == -1) { |
417 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event"); | 420 |
421 pfd.fd = fd; | |
422 pfd.events = 0; | |
423 pfd.revents = 0; | |
424 | |
425 rc = ioctl(dp, DP_ISPOLLED, &pfd); | |
426 | |
427 switch (rc) { | |
428 | |
429 case -1: | |
430 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
431 "ioctl(DP_ISPOLLED) failed for socket %d, event", | |
432 fd, revents); | |
433 break; | |
434 | |
435 case 0: | |
436 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
437 "phantom event %04Xd for closed and removed socket %d", | |
438 revents, fd); | |
439 break; | |
440 | |
441 default: | |
442 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
443 "unexpected event %04Xd for closed and removed socket %d, ", | |
444 "ioctl(DP_ISPOLLED) returned rc:%d, fd:%d, event %04Xd", | |
445 revents, fd, rc, pfd.fd, pfd.revents); | |
446 | |
447 pfd.fd = fd; | |
448 pfd.events = POLLREMOVE; | |
449 pfd.revents = 0; | |
450 | |
451 if (write(dp, &pfd, sizeof(struct pollfd)) | |
452 != (ssize_t) sizeof(struct pollfd)) | |
453 { | |
454 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
455 "write(/dev/poll) for %d failed, fd"); | |
456 } | |
457 | |
458 if (close(fd) == -1) { | |
459 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
460 "close(%d) failed", fd); | |
461 } | |
462 | |
463 break; | |
464 } | |
465 | |
418 continue; | 466 continue; |
419 } | 467 } |
420 | |
421 revents = event_list[i].revents; | |
422 | 468 |
423 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 469 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
424 "devpoll: fd:%d, ev:%04Xd, rev:%04Xd", | 470 "devpoll: fd:%d, ev:%04Xd, rev:%04Xd", |
425 event_list[i].fd, event_list[i].events, revents); | 471 fd, event_list[i].events, revents); |
426 | 472 |
427 if (revents & (POLLERR|POLLHUP|POLLNVAL)) { | 473 if (revents & (POLLERR|POLLHUP|POLLNVAL)) { |
428 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 474 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
429 "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd", | 475 "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd", |
430 event_list[i].fd, event_list[i].events, revents); | 476 fd, event_list[i].events, revents); |
431 } | 477 } |
432 | 478 |
433 if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { | 479 if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { |
434 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | 480 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
435 "strange ioctl(DP_POLL) events " | 481 "strange ioctl(DP_POLL) events " |
436 "fd:%d ev:%04Xd rev:%04Xd", | 482 "fd:%d ev:%04Xd rev:%04Xd", |
437 event_list[i].fd, event_list[i].events, revents); | 483 fd, event_list[i].events, revents); |
438 } | 484 } |
439 | 485 |
440 if ((revents & (POLLERR|POLLHUP|POLLNVAL)) | 486 if ((revents & (POLLERR|POLLHUP|POLLNVAL)) |
441 && (revents & (POLLIN|POLLOUT)) == 0) | 487 && (revents & (POLLIN|POLLOUT)) == 0) |
442 { | 488 { |