void hub_shutdown_service(struct hub_info* hub) { LOG_DEBUG("hub_shutdown_service()"); if (net_backend_get_timeout_queue()) { timeout_queue_remove(net_backend_get_timeout_queue(), hub->stats.timeout); hub_free(hub->stats.timeout); } #ifdef SSL_SUPPORT unload_ssl_certificates(hub); #endif event_queue_shutdown(hub->queue); net_con_close(hub->server); server_alt_port_stop(hub); uman_shutdown(hub->users); list_clear(hub->muxes, &hub_mux_destroy); list_destroy(hub->muxes); hub->status = hub_status_stopped; hub_free(hub->sendbuf); hub_free(hub->recvbuf); list_clear(hub->logout_info, &hub_free); list_destroy(hub->logout_info); command_shutdown(hub->commands); hub_free(hub); hub = 0; g_hub = 0; }
void net_con_clear_timeout(struct net_connection* con) { if (con->timeout && timeout_evt_is_scheduled(con->timeout)) { timeout_queue_remove(net_backend_get_timeout_queue(), con->timeout); hub_free(con->timeout); con->timeout = 0; } }
size_t timeout_queue_process(struct timeout_queue* t, time_t now) { size_t pos = (size_t) t->last; size_t events = 0; struct timeout_evt* evt = 0; t->last = now; for (; pos <= now; pos++) { while ((evt = t->events[pos % t->max])) { timeout_queue_remove(t, evt); evt->callback(evt); events++; } } return events; }
int uman_shutdown(struct hub_info* hub) { if (!hub || !hub->users) return -1; if (net_backend_get_timeout_queue()) { timeout_queue_remove(net_backend_get_timeout_queue(), hub->users->timeout); hub_free(hub->users->timeout); } if (hub->users->list) { list_clear(hub->users->list, &clear_user_list_callback); list_destroy(hub->users->list); } sid_pool_destroy(hub->users->sids); hub_free(hub->users); hub->users = 0; return 0; }
void timeout_queue_reschedule(struct timeout_queue* t, struct timeout_evt* evt, size_t seconds) { if (timeout_evt_is_scheduled(evt)) timeout_queue_remove(t, evt); timeout_queue_insert(t, evt, seconds); }