summaryrefslogtreecommitdiff
path: root/core/io/resource.cpp
diff options
context:
space:
mode:
authorvoidedWarranties <hi+github@voidedxd.xyz>2023-02-19 20:15:22 -0800
committervoidedWarranties <hi+github@voidedxd.xyz>2023-02-20 01:02:08 -0800
commitc586835541cfac68c3d56f91d206f1f37103756c (patch)
tree7f2e1253013ace584c7edbbabd68c76521fd114f /core/io/resource.cpp
parent9f68d06ec2d8dbeb237c5aa5c6f9bbcbe26bde5d (diff)
Make `ResourceCache::get_cached_resources` thread-safe
Diffstat (limited to 'core/io/resource.cpp')
-rw-r--r--core/io/resource.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/core/io/resource.cpp b/core/io/resource.cpp
index 4abcbffb61..6b8ec8d5f6 100644
--- a/core/io/resource.cpp
+++ b/core/io/resource.cpp
@@ -542,9 +542,26 @@ Ref<Resource> ResourceCache::get_ref(const String &p_path) {
void ResourceCache::get_cached_resources(List<Ref<Resource>> *p_resources) {
lock.lock();
+
+ LocalVector<String> to_remove;
+
for (KeyValue<String, Resource *> &E : resources) {
- p_resources->push_back(Ref<Resource>(E.value));
+ Ref<Resource> ref = Ref<Resource>(E.value);
+
+ if (!ref.is_valid()) {
+ // This resource is in the process of being deleted, ignore its existence
+ E.value->path_cache = String();
+ to_remove.push_back(E.key);
+ continue;
+ }
+
+ p_resources->push_back(ref);
+ }
+
+ for (const String &E : to_remove) {
+ resources.erase(E);
}
+
lock.unlock();
}