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:
commit
561bafe91f
2 changed files with 21 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue