Skip to content

Commit 14506a4

Browse files
committed
GDExtension: Prevent crash during shutdown as singletons are deleted
1 parent 2ba22d1 commit 14506a4

File tree

4 files changed

+17
-4
lines changed

4 files changed

+17
-4
lines changed

core/config/engine.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,12 @@ Engine::Engine() {
384384
singleton = this;
385385
}
386386

387+
Engine::~Engine() {
388+
if (singleton == this) {
389+
singleton = nullptr;
390+
}
391+
}
392+
387393
Engine::Singleton::Singleton(const StringName &p_name, Object *p_ptr, const StringName &p_class_name) :
388394
name(p_name),
389395
ptr(p_ptr),

core/config/engine.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ class Engine {
187187
bool notify_frame_server_synced();
188188

189189
Engine();
190-
virtual ~Engine() {}
190+
virtual ~Engine();
191191
};
192192

193193
#endif // ENGINE_H

core/extension/gdextension_manager.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ GDExtensionManager::GDExtensionManager() {
295295
}
296296

297297
GDExtensionManager::~GDExtensionManager() {
298+
if (singleton == this) {
299+
singleton = nullptr;
300+
}
298301
#ifndef DISABLE_DEPRECATED
299302
GDExtensionCompatHashes::finalize();
300303
#endif

core/object/object.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -2095,9 +2095,13 @@ Object::~Object() {
20952095
_extension_instance = nullptr;
20962096
}
20972097
#ifdef TOOLS_ENABLED
2098-
else if (_instance_bindings != nullptr && Engine::get_singleton()->is_extension_reloading_enabled()) {
2099-
for (uint32_t i = 0; i < _instance_binding_count; i++) {
2100-
GDExtensionManager::get_singleton()->untrack_instance_binding(_instance_bindings[i].token, this);
2098+
else if (_instance_bindings != nullptr) {
2099+
Engine *engine = Engine::get_singleton();
2100+
GDExtensionManager *gdextension_manager = GDExtensionManager::get_singleton();
2101+
if (engine && gdextension_manager && engine->is_extension_reloading_enabled()) {
2102+
for (uint32_t i = 0; i < _instance_binding_count; i++) {
2103+
gdextension_manager->untrack_instance_binding(_instance_bindings[i].token, this);
2104+
}
21012105
}
21022106
}
21032107
#endif

0 commit comments

Comments
 (0)