From 98dc9f51cdce0da5eaba97ff0b406d0a872c33a0 Mon Sep 17 00:00:00 2001 From: HJfod <60038575+HJfod@users.noreply.github.com> Date: Sat, 23 Mar 2024 18:10:54 +0200 Subject: [PATCH] clear all server caches after leaving modslayer --- loader/src/server/Server.hpp | 13 +++++++++++-- loader/src/ui/mods/ModListSource.cpp | 2 +- loader/src/ui/mods/ModsLayer.cpp | 4 +++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/loader/src/server/Server.hpp b/loader/src/server/Server.hpp index e3e4d4e1..76d6f561 100644 --- a/loader/src/server/Server.hpp +++ b/loader/src/server/Server.hpp @@ -75,6 +75,8 @@ namespace server { std::optional developer; size_t page = 0; size_t pageSize = 10; + + bool operator==(ModsQuery const& other) const = default; }; struct ServerError { @@ -199,14 +201,14 @@ namespace server { Cache m_cache; public: - static ServerResultCache& shared() { + static ServerResultCache& shared() { static auto inst = ServerResultCache(); static auto _ = listenForSettingChanges("server-cache-size-limit", +[](int64_t size) { ServerResultCache::shared().setSizeLimit(size); }); return inst; } - + ServerPromise get(Query const& query) { return m_cache.get(query); } @@ -225,4 +227,11 @@ namespace server { m_cache.limit(size); } }; + + // Clear all shared server endpoint caches + static void clearServerCaches() { + ServerResultCache<&getMods>::shared().invalidateAll(); + ServerResultCache<&getMod>::shared().invalidateAll(); + ServerResultCache<&getModLogo>::shared().invalidateAll(); + } } diff --git a/loader/src/ui/mods/ModListSource.cpp b/loader/src/ui/mods/ModListSource.cpp index f304ce6f..e609de98 100644 --- a/loader/src/ui/mods/ModListSource.cpp +++ b/loader/src/ui/mods/ModListSource.cpp @@ -89,7 +89,7 @@ static auto loadInstalledModsPage(server::ModsQuery&& query) { } static auto loadServerModsPage(server::ModsQuery&& query) { - return server::getMods(query) + return server::ServerResultCache<&server::getMods>::shared().get(query) .then([](server::ServerModsList list) { auto content = ModListSource::ProvidedMods(); for (auto&& mod : std::move(list.mods)) { diff --git a/loader/src/ui/mods/ModsLayer.cpp b/loader/src/ui/mods/ModsLayer.cpp index 65924c22..3f938b0b 100644 --- a/loader/src/ui/mods/ModsLayer.cpp +++ b/loader/src/ui/mods/ModsLayer.cpp @@ -264,7 +264,9 @@ void ModsLayer::onRefreshList(CCObject*) { void ModsLayer::onBack(CCObject*) { CCDirector::get()->replaceScene(CCTransitionFade::create(.5f, MenuLayer::scene(false))); - server::ServerResultCache<&server::getModLogo>::shared().invalidateAll(); + + // To avoid memory overloading, clear caches after leaving the layer + server::clearServerCaches(); } void ModsLayer::onGoToPage(CCObject*) {