Browse Source

Add an identity check to resource unregistration from cache

This is needed because resources loaded with CACHE_MODE_IGNORE still have path_cache set.
Pedro J. Estébanez 1 year ago
parent
commit
b70afac286
1 changed files with 11 additions and 4 deletions
  1. 11 4
      core/io/resource.cpp

+ 11 - 4
core/io/resource.cpp

@@ -570,11 +570,18 @@ Resource::Resource() :
 		remapped_list(this) {}
 
 Resource::~Resource() {
-	if (!path_cache.is_empty()) {
-		ResourceCache::lock.lock();
-		ResourceCache::resources.erase(path_cache);
-		ResourceCache::lock.unlock();
+	if (unlikely(path_cache.is_empty())) {
+		return;
 	}
+
+	ResourceCache::lock.lock();
+	// Only unregister from the cache if this is the actual resource listed there.
+	// (Other resources can have the same value in `path_cache` if loaded with `CACHE_IGNORE`.)
+	HashMap<String, Resource *>::Iterator E = ResourceCache::resources.find(path_cache);
+	if (likely(E && E->value == this)) {
+		ResourceCache::resources.remove(E);
+	}
+	ResourceCache::lock.unlock();
 }
 
 HashMap<String, Resource *> ResourceCache::resources;