From 7b4b4fd1c3b0b88c87fd2f8f41017d60145302f8 Mon Sep 17 00:00:00 2001 From: erickson Date: Wed, 7 Sep 2005 13:50:55 +0000 Subject: [PATCH] added a function to check the file descriptor before adding it to the select call git-svn-id: svn://svn.open-ils.org/ILS/trunk@1808 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- OpenSRF/src/router/router.c | 38 ++++++++++++++++++++++++++++++------- OpenSRF/src/router/router.h | 4 ++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/OpenSRF/src/router/router.c b/OpenSRF/src/router/router.c index 386fac02ff..71fe7454b9 100644 --- a/OpenSRF/src/router/router.c +++ b/OpenSRF/src/router/router.c @@ -196,19 +196,43 @@ int fill_fd_set( transport_router_registrar* router, fd_set* set ) { max_fd = router_fd; FD_SET( router_fd, set ); - server_class_node* cur_node = router->server_class_list; - while( cur_node != NULL ) { - int cur_class_fd = cur_node->jabber->t_client->session->sock_id; - if( cur_class_fd > max_fd ) - max_fd = cur_class_fd; - FD_SET( cur_class_fd, set ); - cur_node = cur_node->next; + while(1) { + + server_class_node* cur_node = router->server_class_list; + while( cur_node != NULL ) { + int cur_class_fd = cur_node->jabber->t_client->session->sock_id; + + if( check_fd(cur_class_fd) < 0 ) { + warning_handler("Found a dead node for %s", cur_node->server_class); + remove_server_class( router, cur_node ); + break; + + } else { + if( cur_class_fd > max_fd ) max_fd = cur_class_fd; + FD_SET( cur_class_fd, set ); + } + cur_node = cur_node->next; + } + if( cur_node == NULL ) break; } FD_CLR( 0, set ); return max_fd; } +int check_fd( int fd ) { + + fd_set tmpset; + FD_ZERO(&tmpset); + FD_SET(fd, &tmpset); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + + return select(fd + 1, &tmpset, NULL, NULL, &tv); +} + void listen_loop( transport_router_registrar* router ) { diff --git a/OpenSRF/src/router/router.h b/OpenSRF/src/router/router.h index 8690835423..85a5f7491f 100644 --- a/OpenSRF/src/router/router.h +++ b/OpenSRF/src/router/router.h @@ -253,6 +253,10 @@ osrf_message** router_registrar_process_app_request( transport_router_registrar* , osrf_message* omsg, int* num_responses ); +/* returns < 0 if the fd is not valid */ +int check_fd( int fd ); + + // ---------------------------------------------------------------------- // Adds a handler for the SIGUSR1 that we send to wake all the // listening threads. -- 2.43.2