/** * Reads the thread specific userdata to figure out what * we need to handle. Things that purely effect the network * stack should be handled here, but otherwise we should defer * to the connection handlers. */ static void invoke_event_handler(ev_io *watcher, int ready_events) { // Get the user data worker_ev_userdata *data = ev_userdata(); // Read in the data, and close on issues conn_info *conn = watcher->data; if (read_client_data(conn)) { close_client_connection(conn); return; } // Invoke the connection handler, and close connection on error statsite_conn_handler handle = {data->netconf->config, watcher->data}; if (handle_client_connect(&handle)) close_client_connection(conn); }
/* * Invoked when client read data is ready. * We just read all the available data, * append it to the buffers, and then invoke the * connection handlers. */ static void invoke_event_handler(ev_loop *lp, ev_io *watcher, int ready_events) { // Get the user data worker_ev_userdata *data = ev_userdata(lp); // Read in the data, and close on issues conn_info *conn = watcher->data; if (read_client_data(conn)) { close_client_connection(conn); return; } // Prepare to invoke the handler bloom_conn_handler handle; handle.config = data->netconf->config; handle.mgr = data->netconf->mgr; handle.conn = conn; // Reschedule the watcher, unless it's non-active now if (handle_client_connect(&handle) || !conn->active) close_client_connection(conn); }
static void wait_for_all_answers(void) { int retval; struct timeval tv; int fd; int chassis, geoslot; tv.tv_sec = 2; tv.tv_usec = 0; while (1) { int flag = 0; fd_set working_set; for (fd = 0; fd <= max_fs; fd++) { /* scan the list of descriptors we may be listening to */ if (FD_ISSET(fd, &readfds)) flag = 1; /* and see if there are any still set */ } if (flag == 0) return; /* we are done, when they are all gone */ memcpy(&working_set, &readfds, sizeof(readfds)); /* otherwise, we still have to listen for more stuff, till we timeout */ retval = select(max_fs + 1, &working_set, NULL, NULL, &tv); if (retval == -1) { /* an error occured !!!!! */ return; } else if (retval == 0) { /* timeout occured, so process what we've got sofar and return */ printf("timeout\n"); return; } else { for (fd = 0; fd <= max_fs; fd++) { /* scan the list of things to do, and do them */ if (FD_ISSET(fd, &working_set)) { if (read_client_data(fd) == 0) { /* if the socket has closed */ FD_CLR(fd, &readfds); /* and descriptors we listen to for errors */ find_unit_by_fd(fd, &chassis, &geoslot, NULL); close_with_IOP(chassis, geoslot, FIND); /* and close out connection to him */ } } } } } }