From d286080285c26e35429d6d41afa30346fbf71e28 Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Sat, 20 Aug 2022 20:40:05 +0000 Subject: [PATCH] Fixes the default number of workers in TaskManager in case of zero hardware_concurrency. Differential Revision: https://code.wildfiregames.com/D4768 This was SVN commit r27064. --- source/ps/GameSetup/HWDetect.cpp | 10 +++++++++- source/ps/TaskManager.cpp | 19 +++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/source/ps/GameSetup/HWDetect.cpp b/source/ps/GameSetup/HWDetect.cpp index ad4de82697..839a8a3507 100644 --- a/source/ps/GameSetup/HWDetect.cpp +++ b/source/ps/GameSetup/HWDetect.cpp @@ -53,6 +53,7 @@ #include #include +#include static void ReportSDL(const ScriptRequest& rq, JS::HandleValue settings); static void ReportFreeType(const ScriptRequest& rq, JS::HandleValue settings); @@ -194,8 +195,10 @@ void RunHardwareDetection() Script::SetProperty(rq, settings, "timer_resolution", timer_Resolution()); + Script::SetProperty(rq, settings, "hardware_concurrency", std::thread::hardware_concurrency()); + // The version should be increased for every meaningful change. - const int reportVersion = 19; + const int reportVersion = 20; // Send the same data to the reporting system g_UserReporter.SubmitReport( @@ -225,6 +228,11 @@ static void ReportSDL(const ScriptRequest& rq, JS::HandleValue settings) // This is null in atlas (and further the call triggers an assertion). const char* backend = g_VideoMode.GetWindow() ? GetSDLSubsystem(g_VideoMode.GetWindow()) : "none"; Script::SetProperty(rq, settings, "sdl_video_backend", backend ? backend : "unknown"); + + Script::SetProperty(rq, settings, "sdl_display_count", SDL_GetNumVideoDisplays()); + + Script::SetProperty(rq, settings, "sdl_cpu_count", SDL_GetCPUCount()); + Script::SetProperty(rq, settings, "sdl_system_ram", SDL_GetSystemRAM()); } static void ReportFreeType(const ScriptRequest& rq, JS::HandleValue settings) diff --git a/source/ps/TaskManager.cpp b/source/ps/TaskManager.cpp index 292be98e9e..7595a9c936 100644 --- a/source/ps/TaskManager.cpp +++ b/source/ps/TaskManager.cpp @@ -36,15 +36,26 @@ namespace Threading { + +namespace +{ /** * Minimum number of TaskManager workers. */ -static constexpr size_t MIN_THREADS = 3; +constexpr size_t MIN_WORKERS = 3; /** * Maximum number of TaskManager workers. */ -static constexpr size_t MAX_THREADS = 32; +constexpr size_t MAX_WORKERS = 32; + +size_t GetDefaultNumberOfWorkers() +{ + const size_t hardware_concurrency = std::thread::hardware_concurrency(); + return hardware_concurrency ? Clamp(hardware_concurrency - 1, MIN_WORKERS, MAX_WORKERS) : MIN_WORKERS; +} + +} // anonymous namespace std::unique_ptr g_TaskManager; @@ -155,14 +166,14 @@ protected: mutable size_t m_RoundRobinIdx = 0; }; -TaskManager::TaskManager() : TaskManager(std::thread::hardware_concurrency() - 1) +TaskManager::TaskManager() : TaskManager(GetDefaultNumberOfWorkers()) { } TaskManager::TaskManager(size_t numberOfWorkers) { m = std::make_unique(*this); - numberOfWorkers = Clamp(numberOfWorkers, MIN_THREADS, MAX_THREADS); + numberOfWorkers = Clamp(numberOfWorkers, MIN_WORKERS, MAX_WORKERS); m->SetupWorkers(numberOfWorkers); }