comparison src/event/modules/ngx_select_module.c @ 2780:846d6ea7e406

ngx_select_repair_fd_sets()
author Igor Sysoev <igor@sysoev.ru>
date Wed, 29 Apr 2009 15:29:12 +0000
parents 7bb23b7d9f73
children f545c81e5ddb
comparison
equal deleted inserted replaced
2779:7bb23b7d9f73 2780:846d6ea7e406
16 ngx_uint_t flags); 16 ngx_uint_t flags);
17 static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, 17 static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event,
18 ngx_uint_t flags); 18 ngx_uint_t flags);
19 static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, 19 static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
20 ngx_uint_t flags); 20 ngx_uint_t flags);
21 static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle);
21 static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf); 22 static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);
22 23
23 24
24 static fd_set master_read_fd_set; 25 static fd_set master_read_fd_set;
25 static fd_set master_write_fd_set; 26 static fd_set master_write_fd_set;
341 342
342 #if (NGX_WIN32) 343 #if (NGX_WIN32)
343 344
344 if (err) { 345 if (err) {
345 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed"); 346 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed");
347
348 if (err == WSAENOTSOCK) {
349 ngx_select_repair_fd_sets(cycle);
350 }
351
346 return NGX_ERROR; 352 return NGX_ERROR;
347 } 353 }
348 354
349 #else 355 #else
350 356
363 } else { 369 } else {
364 level = NGX_LOG_ALERT; 370 level = NGX_LOG_ALERT;
365 } 371 }
366 372
367 ngx_log_error(level, cycle->log, err, "select() failed"); 373 ngx_log_error(level, cycle->log, err, "select() failed");
374
375 if (err == EBADF) {
376 ngx_select_repair_fd_sets(cycle);
377 }
378
368 return NGX_ERROR; 379 return NGX_ERROR;
369 } 380 }
370 381
371 #endif 382 #endif
372 383
423 434
424 return NGX_OK; 435 return NGX_OK;
425 } 436 }
426 437
427 438
439 static void
440 ngx_select_repair_fd_sets(ngx_cycle_t *cycle)
441 {
442 int n;
443 socklen_t len;
444 ngx_err_t err;
445 ngx_socket_t s;
446
447 #if (NGX_WIN32)
448 u_int i;
449
450 for (i = 0; i < master_read_fd_set.fd_count; i++) {
451
452 s = master_read_fd_set.fd_array[i];
453 len = sizeof(int);
454
455 if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) {
456 err = ngx_socket_errno;
457
458 ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
459 "invalid descriptor #%d in read fd_set", s);
460
461 FD_CLR(s, &master_read_fd_set);
462 }
463 }
464
465 for (i = 0; i < master_write_fd_set.fd_count; i++) {
466
467 s = master_write_fd_set.fd_array[i];
468 len = sizeof(int);
469
470 if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) {
471 err = ngx_socket_errno;
472
473 ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
474 "invalid descriptor #%d in write fd_set", s);
475
476 FD_CLR(s, &master_write_fd_set);
477 }
478 }
479
480 #else
481
482 for (s = 0; s <= max_fd; s++) {
483
484 if (FD_ISSET(s, &master_read_fd_set) == 0) {
485 continue;
486 }
487
488 len = sizeof(int);
489
490 if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {
491 err = ngx_socket_errno;
492
493 ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
494 "invalid descriptor #%d in read fd_set", s);
495
496 FD_CLR(s, &master_read_fd_set);
497 }
498 }
499
500 for (s = 0; s <= max_fd; s++) {
501
502 if (FD_ISSET(s, &master_write_fd_set) == 0) {
503 continue;
504 }
505
506 len = sizeof(int);
507
508 if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) {
509 err = ngx_socket_errno;
510
511 ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
512 "invalid descriptor #%d in write fd_set", s);
513
514 FD_CLR(s, &master_write_fd_set);
515 }
516 }
517
518 max_fd = -1;
519
520 #endif
521 }
522
523
428 static char * 524 static char *
429 ngx_select_init_conf(ngx_cycle_t *cycle, void *conf) 525 ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)
430 { 526 {
431 ngx_event_conf_t *ecf; 527 ngx_event_conf_t *ecf;
432 528