From 1885fe62a9b737577fd337d0c22158059a5bd34c Mon Sep 17 00:00:00 2001 From: erickson Date: Tue, 21 Jun 2005 14:41:59 +0000 Subject: [PATCH] hunting segfaults... git-svn-id: svn://svn.open-ils.org/ILS/trunk@892 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- OpenSRF/src/jserver/jserver-c.c | 2 ++ OpenSRF/src/utils/socket_bundle.c | 58 +++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/OpenSRF/src/jserver/jserver-c.c b/OpenSRF/src/jserver/jserver-c.c index c8d447ef9e..b30ce5aef4 100644 --- a/OpenSRF/src/jserver/jserver-c.c +++ b/OpenSRF/src/jserver/jserver-c.c @@ -157,6 +157,7 @@ void _jserver_remove_client(jserver* js, char* addr) { if(node->addr && !strcmp(node->addr,addr)) { js->client = node->next; + debug_handler("Removing the first jserver client"); socket_disconnect(js->mgr, node->id); _free_jclient_node(node); return; @@ -169,6 +170,7 @@ void _jserver_remove_client(jserver* js, char* addr) { while(node) { if(node->addr && !strcmp(node->addr,addr)) { tail_node->next = node->next; + debug_handler("Removing a jserver client"); socket_disconnect(js->mgr, node->id); _free_jclient_node(node); return; diff --git a/OpenSRF/src/utils/socket_bundle.c b/OpenSRF/src/utils/socket_bundle.c index 113f2f8a1f..1a5497fa02 100644 --- a/OpenSRF/src/utils/socket_bundle.c +++ b/OpenSRF/src/utils/socket_bundle.c @@ -293,31 +293,49 @@ int socket_wait_all(socket_manager* mgr, int timeout) { int _socket_route_data( socket_manager* mgr, int num_active, fd_set* read_set) { - socket_node* node = mgr->socket; - int handled = 0; - - while(node && (handled < num_active)) { + if(mgr == NULL) return -1; - int sock_fd = node->sock_fd; - /* does this socket have data? */ - if( FD_ISSET( sock_fd, read_set ) ) { + /* come back here if someone yanks a socket_node from beneath us */ + while(1) { - debug_handler("Socket %d active", sock_fd); - handled++; - FD_CLR(sock_fd, read_set); - - if(node->endpoint == SERVER_SOCKET) - _socket_handle_new_client(mgr, node); + socket_node* node = mgr->socket; + int handled = 0; + int status = 0; + + while(node && (handled < num_active)) { + + int sock_fd = node->sock_fd; + + /* does this socket have data? */ + if( FD_ISSET( sock_fd, read_set ) ) { + + debug_handler("Socket %d active", sock_fd); + handled++; + FD_CLR(sock_fd, read_set); + + if(node->endpoint == SERVER_SOCKET) + _socket_handle_new_client(mgr, node); + + if(node->endpoint == CLIENT_SOCKET ) + status = _socket_handle_client_data(mgr, node); + + /* someone may have yanked a socket_node out from under + us...start over with the first socket */ + if(status == -1) { + debug_handler("Backtracking back to start of loop because " + "of -1 return code from _socket_handle_client_data()"); + } + } - if(node->endpoint == CLIENT_SOCKET ) - _socket_handle_client_data(mgr, node); + if(status == -1) break; + node = node->next; } // is_set - - node = node->next; - } // while(node) + if(status == 0) break; + if(status == -1) status = 0; + } return 0; } @@ -385,8 +403,10 @@ int _socket_handle_client_data(socket_manager* mgr, socket_node* node) { } if(read_bytes == 0) { /* socket closed by client */ - if(mgr->on_socket_closed) + if(mgr->on_socket_closed) { mgr->on_socket_closed(mgr->blob, sock_fd); + return -1; + } } return 0; -- 2.43.2