From 1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df Mon Sep 17 00:00:00 2001 From: Nicolas James Date: Wed, 12 Feb 2025 18:05:18 +1100 Subject: initial commit --- src/server/resources.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/server/resources.cc (limited to 'src/server/resources.cc') diff --git a/src/server/resources.cc b/src/server/resources.cc new file mode 100644 index 0000000..7eb3d8b --- /dev/null +++ b/src/server/resources.cc @@ -0,0 +1,59 @@ +#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 -- cgit v1.2.3