Browse Source

Fix `GDScriptCache` to not remove scripts/scenes individually when clearing

Adam Scott 2 years ago
parent
commit
ff544df926
2 changed files with 21 additions and 10 deletions
  1. 20 2
      modules/gdscript/gdscript_cache.cpp
  2. 1 8
      modules/gdscript/gdscript_cache.h

+ 20 - 2
modules/gdscript/gdscript_cache.cpp

@@ -128,6 +128,10 @@ void GDScriptCache::move_script(const String &p_from, const String &p_to) {
 
 	MutexLock lock(singleton->mutex);
 
+	if (singleton->cleared) {
+		return;
+	}
+
 	for (KeyValue<String, HashSet<String>> &E : singleton->packed_scene_dependencies) {
 		if (E.value.has(p_from)) {
 			E.value.insert(p_to);
@@ -158,6 +162,10 @@ void GDScriptCache::remove_script(const String &p_path) {
 
 	MutexLock lock(singleton->mutex);
 
+	if (singleton->cleared) {
+		return;
+	}
+
 	for (KeyValue<String, HashSet<String>> &E : singleton->packed_scene_dependencies) {
 		if (!E.value.has(p_path)) {
 			continue;
@@ -371,6 +379,10 @@ void GDScriptCache::clear_unreferenced_packed_scenes() {
 
 	MutexLock lock(singleton->mutex);
 
+	if (singleton->cleared) {
+		return;
+	}
+
 	for (KeyValue<String, HashSet<String>> &E : singleton->packed_scene_dependencies) {
 		if (E.value.size() > 0 || !ResourceLoader::is_imported(E.key)) {
 			continue;
@@ -388,6 +400,11 @@ void GDScriptCache::clear() {
 
 	MutexLock lock(singleton->mutex);
 
+	if (singleton->cleared) {
+		return;
+	}
+	singleton->cleared = true;
+
 	RBSet<Ref<GDScriptParserRef>> parser_map_refs;
 	for (KeyValue<String, GDScriptParserRef *> &E : singleton->parser_map) {
 		parser_map_refs.insert(E.value);
@@ -417,7 +434,8 @@ GDScriptCache::GDScriptCache() {
 }
 
 GDScriptCache::~GDScriptCache() {
-	destructing = true;
-	clear();
+	if (!cleared) {
+		clear();
+	}
 	singleton = nullptr;
 }

+ 1 - 8
modules/gdscript/gdscript_cache.h

@@ -87,7 +87,7 @@ class GDScriptCache {
 
 	static GDScriptCache *singleton;
 
-	bool destructing = false;
+	bool cleared = false;
 
 	Mutex mutex;
 
@@ -104,13 +104,6 @@ public:
 	static Ref<PackedScene> get_packed_scene(const String &p_path, Error &r_error, const String &p_owner = "");
 	static void clear_unreferenced_packed_scenes();
 
-	static bool is_destructing() {
-		if (singleton == nullptr) {
-			return true;
-		}
-		return singleton->destructing;
-	};
-
 	static void clear();
 
 	GDScriptCache();