diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 98033998..ac9dc29c 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -1783,14 +1783,12 @@ void mj_clearCache(mjCache* cache) { // get the internal asset cache used by the compiler mjCache* mj_getCache() { + static mjCache cache_cwrapper = {0}; // mjCCache is not trivially destructible and so the global cache needs to // allocated on the heap if constexpr (kGlobalCacheSize != 0) { static mjCCache* cache = new(std::nothrow) mjCCache(kGlobalCacheSize); - static mjCache cache_cwrapper; - cache_cwrapper.impl_ = cache; - return cache->Capacity() > 0 ? &cache_cwrapper : nullptr; - } else { - return nullptr; + cache_cwrapper.impl_ = cache->Capacity() > 0 ? cache : nullptr; } + return &cache_cwrapper; } diff --git a/src/user/user_cache.cc b/src/user/user_cache.cc index fd8660fc..4fb37022 100644 --- a/src/user/user_cache.cc +++ b/src/user/user_cache.cc @@ -116,10 +116,10 @@ bool mjCCache::PopulateData(const std::string& id, const mjResource* resource, m } mjCAsset* asset = &(it->second); - asset->IncrementAccess(); // update priority queue entries_.erase(asset); + asset->IncrementAccess(); entries_.insert(asset); return asset->PopulateData(fn); diff --git a/test/user/user_api_test.cc b/test/user/user_api_test.cc index a84f3d09..4823aa07 100644 --- a/test/user/user_api_test.cc +++ b/test/user/user_api_test.cc @@ -751,6 +751,42 @@ TEST_F(PluginTest, RecompileComparePngCache) { mj_deleteVFS(vfs.get()); } +TEST_F(PluginTest, DisableCache) { + static constexpr char xml[] = R"( + + + + + + + + + + +)"; + + mjCache* cache = mj_getCache(); + std::size_t capacity = mj_getCacheCapacity(cache); + mj_setCacheCapacity(cache, 0); + + auto vfs = std::make_unique(); + mj_defaultVFS(vfs.get()); + mj_addBufferVFS(vfs.get(), "tex.png", tex1, sizeof(tex1)); + + std::array error; + + // load model once + mjModel* m = LoadModelFromString(xml, error.data(), error.size(), vfs.get()); + + EXPECT_EQ(mj_getCacheSize(cache), 0); + EXPECT_EQ(m->ntexdata, 18); // w x h x rgb = 3 x 2 x 3 + + mj_setCacheCapacity(cache, capacity); + + mj_deleteModel(m); + mj_deleteVFS(vfs.get()); +} + // -------------------------------- test textures ------------------------------ TEST_F(PluginTest, TextureFromBuffer) {