Skip to content

Commit

Permalink
reservedThreadCount (#207)
Browse files Browse the repository at this point in the history
* reservedThreadCount

* clang

* pass it all the way through

* clang

* defaults

---------

Co-authored-by: briaguya <briaguya@alice>
  • Loading branch information
briaguya-ai and briaguya committed May 11, 2023
1 parent 9d83e10 commit 57660fb
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 16 deletions.
17 changes: 10 additions & 7 deletions src/core/Context.cpp
Expand Up @@ -24,11 +24,12 @@ std::shared_ptr<Context> Context::GetInstance() {

std::shared_ptr<Context> Context::CreateInstance(const std::string name, const std::string shortName,
const std::vector<std::string>& otrFiles,
const std::unordered_set<uint32_t>& validHashes) {
const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount) {
if (mContext.expired()) {
auto shared = std::make_shared<Context>(name, shortName);
mContext = shared;
shared->Init(otrFiles, validHashes);
shared->Init(otrFiles, validHashes, reservedThreadCount);
return shared;
}

Expand Down Expand Up @@ -63,11 +64,12 @@ void Context::CreateDefaultSettings() {
}
}

void Context::Init(const std::vector<std::string>& otrFiles, const std::unordered_set<uint32_t>& validHashes) {
void Context::Init(const std::vector<std::string>& otrFiles, const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount) {
InitLogging();
InitConfiguration();
InitConsoleVariables();
InitResourceManager(otrFiles, validHashes);
InitResourceManager(otrFiles, validHashes, reservedThreadCount);
CreateDefaultSettings();
InitControlDeck();
InitCrashHandler();
Expand Down Expand Up @@ -167,13 +169,14 @@ void Context::InitConsoleVariables() {
}

void Context::InitResourceManager(const std::vector<std::string>& otrFiles,
const std::unordered_set<uint32_t>& validHashes) {
const std::unordered_set<uint32_t>& 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<ResourceManager>(GetInstance(), mMainPath, mPatchesPath, validHashes);
mResourceManager =
std::make_shared<ResourceManager>(GetInstance(), mMainPath, mPatchesPath, validHashes, reservedThreadCount);
} else {
mResourceManager = std::make_shared<ResourceManager>(GetInstance(), otrFiles, validHashes);
mResourceManager = std::make_shared<ResourceManager>(GetInstance(), otrFiles, validHashes, reservedThreadCount);
}

if (!mResourceManager->DidLoadSuccessfully()) {
Expand Down
8 changes: 5 additions & 3 deletions src/core/Context.h
Expand Up @@ -19,7 +19,8 @@ class Context {
static std::shared_ptr<Context> GetInstance();
static std::shared_ptr<Context> CreateInstance(const std::string name, const std::string shortName,
const std::vector<std::string>& otrFiles = {},
const std::unordered_set<uint32_t>& validHashes = {});
const std::unordered_set<uint32_t>& validHashes = {},
uint32_t reservedThreadCount = 1);

static std::string GetAppBundlePath();
static std::string GetAppDirectoryPath();
Expand All @@ -28,7 +29,8 @@ class Context {

Context(std::string name, std::string shortName);

void Init(const std::vector<std::string>& otrFiles, const std::unordered_set<uint32_t>& validHashes);
void Init(const std::vector<std::string>& otrFiles, const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount);

bool DoesOtrFileExist();

Expand All @@ -49,7 +51,7 @@ class Context {
void InitConfiguration();
void InitConsoleVariables();
void InitResourceManager(const std::vector<std::string>& otrFiles = {},
const std::unordered_set<uint32_t>& validHashes = {});
const std::unordered_set<uint32_t>& validHashes = {}, uint32_t reservedThreadCount = 1);
void InitControlDeck();
void InitCrashHandler();
void InitAudioPlayer(std::string backend);
Expand Down
11 changes: 7 additions & 4 deletions src/resource/ResourceManager.cpp
Expand Up @@ -16,14 +16,16 @@ extern bool SFileCheckWildCard(const char* szString, const char* szWildCard);
namespace LUS {

ResourceManager::ResourceManager(std::shared_ptr<Context> context, const std::string& mainPath,
const std::string& patchesPath, const std::unordered_set<uint32_t>& validHashes)
const std::string& patchesPath, const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount)
: mContext(context) {
mResourceLoader = std::make_shared<ResourceLoader>(context);
mArchive = std::make_shared<Archive>(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<BS::thread_pool>(threadCount);

Expand All @@ -34,14 +36,15 @@ ResourceManager::ResourceManager(std::shared_ptr<Context> context, const std::st
}

ResourceManager::ResourceManager(std::shared_ptr<Context> context, const std::vector<std::string>& otrFiles,
const std::unordered_set<uint32_t>& validHashes)
const std::unordered_set<uint32_t>& validHashes, uint32_t reservedThreadCount)
: mContext(context) {
mResourceLoader = std::make_shared<ResourceLoader>(context);
mArchive = std::make_shared<Archive>(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<BS::thread_pool>(threadCount);

Expand Down
4 changes: 2 additions & 2 deletions src/resource/ResourceManager.h
Expand Up @@ -23,9 +23,9 @@ class ResourceManager {

public:
ResourceManager(std::shared_ptr<Context> context, const std::string& mainPath, const std::string& patchesPath,
const std::unordered_set<uint32_t>& validHashes);
const std::unordered_set<uint32_t>& validHashes, uint32_t reservedThreadCount = 1);
ResourceManager(std::shared_ptr<Context> context, const std::vector<std::string>& otrFiles,
const std::unordered_set<uint32_t>& validHashes);
const std::unordered_set<uint32_t>& validHashes, uint32_t reservedThreadCount = 1);
~ResourceManager();

bool DidLoadSuccessfully();
Expand Down

0 comments on commit 57660fb

Please sign in to comment.