diff --git a/src/resource/ResourceManager.cpp b/src/resource/ResourceManager.cpp index a48c49d43..317ecb18d 100644 --- a/src/resource/ResourceManager.cpp +++ b/src/resource/ResourceManager.cpp @@ -291,14 +291,14 @@ ResourceManager::GetCachedResource(std::variant>> -ResourceManager::LoadResourcesProcess(const ResourceFilter& filter) { +ResourceManager::LoadResourcesProcess(const ResourceFilter& filter, bool exact) { auto loadedList = std::make_shared>>(); auto fileList = GetArchiveManager()->ListFiles(filter.IncludeMasks, filter.ExcludeMasks); loadedList->reserve(fileList->size()); for (size_t i = 0; i < fileList->size(); i++) { auto fileName = std::string(fileList->operator[](i)); - auto resource = LoadResource({ fileName, filter.Owner, filter.Parent }); + auto resource = LoadResource({ fileName, filter.Owner, filter.Parent }, exact); loadedList->push_back(resource); } @@ -306,25 +306,25 @@ ResourceManager::LoadResourcesProcess(const ResourceFilter& filter) { } std::shared_future>>> -ResourceManager::LoadResourcesAsync(const ResourceFilter& filter, BS::priority_t priority) { +ResourceManager::LoadResourcesAsync(const ResourceFilter& filter, BS::priority_t priority, bool exact) { return mThreadPool->submit_task( - [this, filter]() -> std::shared_ptr>> { - return LoadResourcesProcess(filter); + [this, filter, exact]() -> std::shared_ptr>> { + return LoadResourcesProcess(filter, exact); }, priority); } std::shared_future>>> -ResourceManager::LoadResourcesAsync(const std::string& searchMask, BS::priority_t priority) { - return LoadResourcesAsync({ { searchMask }, {}, mDefaultCacheOwner, mDefaultCacheArchive }, priority); +ResourceManager::LoadResourcesAsync(const std::string& searchMask, BS::priority_t priority, bool exact) { + return LoadResourcesAsync({ { searchMask }, {}, mDefaultCacheOwner, mDefaultCacheArchive }, priority, exact); } -std::shared_ptr>> ResourceManager::LoadResources(const std::string& searchMask) { - return LoadResources({ { searchMask }, {}, mDefaultCacheOwner, mDefaultCacheArchive }); +std::shared_ptr>> ResourceManager::LoadResources(const std::string& searchMask, bool exact) { + return LoadResources({ { searchMask }, {}, mDefaultCacheOwner, mDefaultCacheArchive }, exact); } -std::shared_ptr>> ResourceManager::LoadResources(const ResourceFilter& filter) { - return LoadResourcesAsync(filter, BS::pr::highest).get(); +std::shared_ptr>> ResourceManager::LoadResources(const ResourceFilter& filter, bool exact) { + return LoadResourcesAsync(filter, BS::pr::highest, exact).get(); } void ResourceManager::DirtyResources(const ResourceFilter& filter) { @@ -411,4 +411,14 @@ void ResourceManager::SetAltAssetsEnabled(bool isEnabled) { mAltAssetsEnabled = isEnabled; } +void ResourceManager::ShutDownThreadPool() { + mThreadPool->pause(); + mThreadPool->wait_for(std::chrono::duration(2)); + mThreadPool->purge(); +} + +void ResourceManager::ThreadPoolWait(std::chrono::duration interval) { + mThreadPool->wait_for(interval); +} + } // namespace Ship diff --git a/src/resource/ResourceManager.h b/src/resource/ResourceManager.h index db67f137a..6f4a7e681 100644 --- a/src/resource/ResourceManager.h +++ b/src/resource/ResourceManager.h @@ -84,12 +84,12 @@ class ResourceManager { size_t UnloadResource(const ResourceIdentifier& identifier); size_t UnloadResource(const std::string& filePath); - std::shared_ptr>> LoadResources(const std::string& searchMask); - std::shared_ptr>> LoadResources(const ResourceFilter& filter); + std::shared_ptr>> LoadResources(const std::string& searchMask, bool exact = false); + std::shared_ptr>> LoadResources(const ResourceFilter& filter, bool exact = false); std::shared_future>>> - LoadResourcesAsync(const std::string& searchMask, BS::priority_t priority = BS::pr::normal); + LoadResourcesAsync(const std::string& searchMask, BS::priority_t priority = BS::pr::normal, bool exact = false); std::shared_future>>> - LoadResourcesAsync(const ResourceFilter& filter, BS::priority_t priority = BS::pr::normal); + LoadResourcesAsync(const ResourceFilter& filter, BS::priority_t priority = BS::pr::normal, bool exact = false); void DirtyResources(const std::string& searchMask); void DirtyResources(const ResourceFilter& filter); @@ -101,9 +101,11 @@ class ResourceManager { bool OtrSignatureCheck(const char* fileName); bool IsAltAssetsEnabled(); void SetAltAssetsEnabled(bool isEnabled); + void ShutDownThreadPool(); + void ThreadPoolWait(std::chrono::duration interval); protected: - std::shared_ptr>> LoadResourcesProcess(const ResourceFilter& filter); + std::shared_ptr>> LoadResourcesProcess(const ResourceFilter& filter, bool exact = false); void UnloadResourcesProcess(const ResourceFilter& filter); std::variant> CheckCache(const ResourceIdentifier& identifier, bool loadExact = false);