From 92b6df7653f2f7e5e1fa1779c35f0481a66dc663 Mon Sep 17 00:00:00 2001 From: Quentin Date: Thu, 21 Sep 2023 20:08:23 +0200 Subject: [PATCH] fix(player-db): restore old on-demand thread creation behavior. (#2167) Fixes #2160 --- .../player_database_service.cpp | 42 ++++++++++++------- src/views/network/view_player_database.cpp | 1 + 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/services/player_database/player_database_service.cpp b/src/services/player_database/player_database_service.cpp index fc660690..24316986 100644 --- a/src/services/player_database/player_database_service.cpp +++ b/src/services/player_database/player_database_service.cpp @@ -273,26 +273,39 @@ namespace big void player_database_service::start_update_loop() { + // So that it doesnt immediately exit the first time. + static bool first_time = true; + + if (!g.player_db.update_player_online_states) + { + first_time = false; + return; + } + g_thread_pool->push([this] { - while (!g_running) - std::this_thread::yield(); + if (first_time) + { + while (!g_running) + { + std::this_thread::yield(); + } + + first_time = false; + } static auto last_update = std::chrono::high_resolution_clock::now() - 45s; - while (g_running) + while (g_running && g.player_db.update_player_online_states) { - if (g.player_db.update_player_online_states) + const auto cur = std::chrono::high_resolution_clock::now(); + if (cur - last_update > 45s && !updating) { - const auto cur = std::chrono::high_resolution_clock::now(); - if (cur - last_update > 45s && !updating) - { - updating = true; - g_fiber_pool->queue_job([this] { - update_player_states(true); - updating = false; - last_update = std::chrono::high_resolution_clock::now(); - }); - } + updating = true; + g_fiber_pool->queue_job([this] { + update_player_states(true); + updating = false; + last_update = std::chrono::high_resolution_clock::now(); + }); } std::this_thread::sleep_for(1s); @@ -329,6 +342,7 @@ namespace big { rage::rlScTaskStatus status{}; + // TODO: big sized object on the stack, might be a problem in the future rage::rlQueryPresenceAttributesContext contexts[bucket_size][9]{}; rage::rlQueryPresenceAttributesContext* contexts_per_player[bucket_size]{}; diff --git a/src/views/network/view_player_database.cpp b/src/views/network/view_player_database.cpp index fea45e85..6e732b83 100644 --- a/src/views/network/view_player_database.cpp +++ b/src/views/network/view_player_database.cpp @@ -300,6 +300,7 @@ namespace big { if (components::command_checkbox<"player_db_auto_update_states">("Enable")) g_player_database_service->start_update_loop(); + ImGui::Checkbox("Notify When Online", &g.player_db.notify_when_online); ImGui::Checkbox("Notify When Joinable", &g.player_db.notify_when_joinable); ImGui::Checkbox("Notify When Unjoinable", &g.player_db.notify_when_unjoinable);