int Server_run() { int rc = 0; Server *srv = Server_queue_latest(); check(srv != NULL, "Failed to get a server from the configured queue."); int listen_fd = srv->listen_fd; taskname("SERVER"); while(RUNNING) { rc = Server_accept(listen_fd); if(rc == -1 && RUNNING) { log_err("Server accept failed, attempting to clear out dead weight: %d", RUNNING); int cleared = Register_cleanout(); if(cleared == 0) { taskdelay(1000); } } } return 0; error: return -1; }
void tickertask(void *v) { (void)v; taskname("ticker"); while(!task_was_signaled()) { THE_CURRENT_TIME_IS = time(NULL); int min_wait = Setting_get_int("limits.tick_timer", 10); taskdelay(min_wait * 1000); // avoid doing this during a reload attempt if(!RELOAD) { // don't bother if these are all 0 int min_ping = Setting_get_int("limits.min_ping", DEFAULT_MIN_PING); int min_write_rate = Setting_get_int("limits.min_write_rate", DEFAULT_MIN_READ_RATE); int min_read_rate = Setting_get_int("limits.min_read_rate", DEFAULT_MIN_WRITE_RATE); if(min_ping > 0 || min_write_rate > 0 || min_read_rate > 0) { int cleared = Register_cleanout(); if(cleared > 0) { log_warn("Timeout task killed %d tasks, waiting %d seconds for more.", cleared, min_wait); } else { debug("No connections timed out."); } } // do a server queue cleanup to get rid of dead servers Server_queue_cleanup(); } } }