summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-08-16 14:35:26 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-08-16 14:35:26 +0200
commita88b828eb08734339e91a1d06f251f35575133a3 (patch)
tree817eb7134f4ba5c3d21f4a55044d25f20884c73b
parent5847d362de70379a28ecd70c890f7fce09f24220 (diff)
parentf15ad7235548130be49e00b44b33e8eb64bb6bc3 (diff)
downloadredot-engine-a88b828eb08734339e91a1d06f251f35575133a3.tar.gz
Merge pull request #95513 from bruvzg/ds_init_cleanup
Run cleanup code on DisplayServer init failure to prevent crash on exit.
-rw-r--r--main/main.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/main/main.cpp b/main/main.cpp
index 599da2e97f..4e8adb519c 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -2537,7 +2537,10 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
OS::get_singleton()->benchmark_end_measure("Startup", "Main::Setup");
if (p_second_phase) {
- return setup2();
+ exit_err = setup2();
+ if (exit_err != OK) {
+ goto error;
+ }
}
return OK;
@@ -2835,6 +2838,30 @@ Error Main::setup2(bool p_show_boot_logo) {
if (err != OK || display_server == nullptr) {
ERR_PRINT("Unable to create DisplayServer, all display drivers failed.\nUse \"--headless\" command line argument to run the engine in headless mode if this is desired (e.g. for continuous integration).");
+
+ if (display_server) {
+ memdelete(display_server);
+ }
+
+ GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
+ uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
+ unregister_server_types();
+
+ if (input) {
+ memdelete(input);
+ }
+ if (tsman) {
+ memdelete(tsman);
+ }
+#ifndef _3D_DISABLED
+ if (physics_server_3d_manager) {
+ memdelete(physics_server_3d_manager);
+ }
+#endif // _3D_DISABLED
+ if (physics_server_2d_manager) {
+ memdelete(physics_server_2d_manager);
+ }
+
return err;
}