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 {