diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 18:05:18 +1100 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 18:05:18 +1100 |
| commit | 1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df (patch) | |
| tree | 222dfcd07a1e40716127a347bbfd7119ce3d0984 /src/server/resources.cc | |
initial commit
Diffstat (limited to 'src/server/resources.cc')
| -rw-r--r-- | src/server/resources.cc | 59 |
1 files changed, 59 insertions, 0 deletions
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<resources> get_resources_lock() noexcept { + return low_priority_lock<resources>{get_resources()}; +} +high_priority_lock<resources> get_resources_lock_immediate() noexcept { + return high_priority_lock<resources>{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 |
