aboutsummaryrefslogtreecommitdiff
path: root/src/server/resources.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/resources.cc')
-rw-r--r--src/server/resources.cc59
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