From 57660fbb186d85923a1f771bfaafe241c209e579 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Wed, 10 May 2023 20:33:04 -0400 Subject: [PATCH] reservedThreadCount (#207) * reservedThreadCount * clang * pass it all the way through * clang * defaults --------- Co-authored-by: briaguya --- src/core/Context.cpp | 17 ++++++++++------- src/core/Context.h | 8 +++++--- src/resource/ResourceManager.cpp | 11 +++++++---- src/resource/ResourceManager.h | 4 ++-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/core/Context.cpp b/src/core/Context.cpp index 4f99518eb..776333ef4 100644 --- a/src/core/Context.cpp +++ b/src/core/Context.cpp @@ -24,11 +24,12 @@ std::shared_ptr Context::GetInstance() { std::shared_ptr Context::CreateInstance(const std::string name, const std::string shortName, const std::vector& otrFiles, - const std::unordered_set& validHashes) { + const std::unordered_set& validHashes, + uint32_t reservedThreadCount) { if (mContext.expired()) { auto shared = std::make_shared(name, shortName); mContext = shared; - shared->Init(otrFiles, validHashes); + shared->Init(otrFiles, validHashes, reservedThreadCount); return shared; } @@ -63,11 +64,12 @@ void Context::CreateDefaultSettings() { } } -void Context::Init(const std::vector& otrFiles, const std::unordered_set& validHashes) { +void Context::Init(const std::vector& otrFiles, const std::unordered_set& validHashes, + uint32_t reservedThreadCount) { InitLogging(); InitConfiguration(); InitConsoleVariables(); - InitResourceManager(otrFiles, validHashes); + InitResourceManager(otrFiles, validHashes, reservedThreadCount); CreateDefaultSettings(); InitControlDeck(); InitCrashHandler(); @@ -167,13 +169,14 @@ void Context::InitConsoleVariables() { } void Context::InitResourceManager(const std::vector& otrFiles, - const std::unordered_set& validHashes) { + const std::unordered_set& validHashes, uint32_t reservedThreadCount) { mMainPath = GetConfig()->getString("Game.Main Archive", GetAppDirectoryPath()); mPatchesPath = mConfig->getString("Game.Patches Archive", GetAppDirectoryPath() + "/mods"); if (otrFiles.empty()) { - mResourceManager = std::make_shared(GetInstance(), mMainPath, mPatchesPath, validHashes); + mResourceManager = + std::make_shared(GetInstance(), mMainPath, mPatchesPath, validHashes, reservedThreadCount); } else { - mResourceManager = std::make_shared(GetInstance(), otrFiles, validHashes); + mResourceManager = std::make_shared(GetInstance(), otrFiles, validHashes, reservedThreadCount); } if (!mResourceManager->DidLoadSuccessfully()) { diff --git a/src/core/Context.h b/src/core/Context.h index 423b2efa3..c32f4ddbc 100644 --- a/src/core/Context.h +++ b/src/core/Context.h @@ -19,7 +19,8 @@ class Context { static std::shared_ptr GetInstance(); static std::shared_ptr CreateInstance(const std::string name, const std::string shortName, const std::vector& otrFiles = {}, - const std::unordered_set& validHashes = {}); + const std::unordered_set& validHashes = {}, + uint32_t reservedThreadCount = 1); static std::string GetAppBundlePath(); static std::string GetAppDirectoryPath(); @@ -28,7 +29,8 @@ class Context { Context(std::string name, std::string shortName); - void Init(const std::vector& otrFiles, const std::unordered_set& validHashes); + void Init(const std::vector& otrFiles, const std::unordered_set& validHashes, + uint32_t reservedThreadCount); bool DoesOtrFileExist(); @@ -49,7 +51,7 @@ class Context { void InitConfiguration(); void InitConsoleVariables(); void InitResourceManager(const std::vector& otrFiles = {}, - const std::unordered_set& validHashes = {}); + const std::unordered_set& validHashes = {}, uint32_t reservedThreadCount = 1); void InitControlDeck(); void InitCrashHandler(); void InitAudioPlayer(std::string backend); diff --git a/src/resource/ResourceManager.cpp b/src/resource/ResourceManager.cpp index 62e8bd4c2..1933719c8 100644 --- a/src/resource/ResourceManager.cpp +++ b/src/resource/ResourceManager.cpp @@ -16,14 +16,16 @@ extern bool SFileCheckWildCard(const char* szString, const char* szWildCard); namespace LUS { ResourceManager::ResourceManager(std::shared_ptr context, const std::string& mainPath, - const std::string& patchesPath, const std::unordered_set& validHashes) + const std::string& patchesPath, const std::unordered_set& validHashes, + uint32_t reservedThreadCount) : mContext(context) { mResourceLoader = std::make_shared(context); mArchive = std::make_shared(mainPath, patchesPath, validHashes, false); #if defined(__SWITCH__) || defined(__WIIU__) size_t threadCount = 1; #else - size_t threadCount = std::max(1U, std::thread::hardware_concurrency() - 1); + // the extra `- 1` is because we reserve an extra thread for spdlog + size_t threadCount = std::max(1U, (std::thread::hardware_concurrency() - reservedThreadCount - 1)); #endif mThreadPool = std::make_shared(threadCount); @@ -34,14 +36,15 @@ ResourceManager::ResourceManager(std::shared_ptr context, const std::st } ResourceManager::ResourceManager(std::shared_ptr context, const std::vector& otrFiles, - const std::unordered_set& validHashes) + const std::unordered_set& validHashes, uint32_t reservedThreadCount) : mContext(context) { mResourceLoader = std::make_shared(context); mArchive = std::make_shared(otrFiles, validHashes, false); #if defined(__SWITCH__) || defined(__WIIU__) size_t threadCount = 1; #else - size_t threadCount = std::max(1U, std::thread::hardware_concurrency() - 1); + // the extra `- 1` is because we reserve an extra thread for spdlog + size_t threadCount = std::max(1U, (std::thread::hardware_concurrency() - reservedThreadCount - 1)); #endif mThreadPool = std::make_shared(threadCount); diff --git a/src/resource/ResourceManager.h b/src/resource/ResourceManager.h index f10dace49..907b3cce6 100644 --- a/src/resource/ResourceManager.h +++ b/src/resource/ResourceManager.h @@ -23,9 +23,9 @@ class ResourceManager { public: ResourceManager(std::shared_ptr context, const std::string& mainPath, const std::string& patchesPath, - const std::unordered_set& validHashes); + const std::unordered_set& validHashes, uint32_t reservedThreadCount = 1); ResourceManager(std::shared_ptr context, const std::vector& otrFiles, - const std::unordered_set& validHashes); + const std::unordered_set& validHashes, uint32_t reservedThreadCount = 1); ~ResourceManager(); bool DidLoadSuccessfully();