Mercurial > hg > nginx
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 |