Merge pull request #69865 from adamscott/fix-gdscript-cache-remove-script-crash

Fix `GDScriptCache` to not remove scripts/scenes individually when clearing
This commit is contained in:
Rémi Verschelde 2022-12-10 19:31:57 +01:00 committed by GitHub
commit 561bafe91f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 10 deletions

View file

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

View file

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