#include "resources.hh" namespace server { namespace resources { void init() noexcept { server::database::init(); } // NOT THREAD SAFE! Use get_resources_lock! static client_map& get_client_map() noexcept { static client_map ret{}; return ret; } static chunk_map& get_chunk_map() noexcept { static chunk_map ret{314'159, shared::world::chunk::hash, shared::world::chunk::equal}; return ret; } static pool_t& get_pool() noexcept { static pool_t ret{}; return ret; } static resources& get_resources() noexcept { static struct resources ret = {.clients = get_client_map(), .chunks = get_chunk_map(), .pool = get_pool()}; return ret; } low_priority_lock get_resources_lock() noexcept { return low_priority_lock{get_resources()}; } high_priority_lock get_resources_lock_immediate() noexcept { return high_priority_lock{get_resources()}; } void quit() noexcept { const auto sleep = []() { std::this_thread::sleep_for(std::chrono::milliseconds(10)); }; // we recursively post in some cases, so this check is necessary. while (!get_resources_lock()->clients.empty()) { sleep(); continue; } while (!get_resources_lock()->chunks.empty()) { sleep(); continue; } get_resources_lock()->pool.join(); server::database::quit(); } } // namespace resources } // namespace server