From 1a4400facf821b2edf490dfcc348c59eeb4f99b0 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 25 Dec 2012 01:56:49 +0100 Subject: [PATCH] Fixed module initialisation failure bug If a module initialisation failed, then it resources may or may not be freed. This is fixed. Former-commit-id: 029e0844e392685a31b3afc02c5bf772e015a372 --- src/Nazara/3D/3D.cpp | 2 ++ src/Nazara/Audio/Audio.cpp | 25 +++++++++++++++++-------- src/Nazara/Core/Core.cpp | 2 ++ src/Nazara/Noise/Noise.cpp | 2 ++ src/Nazara/Renderer/Renderer.cpp | 8 +++++++- src/Nazara/Utility/Utility.cpp | 8 +++++++- 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/Nazara/3D/3D.cpp b/src/Nazara/3D/3D.cpp index 8e0178ea7..3ec86b628 100644 --- a/src/Nazara/3D/3D.cpp +++ b/src/Nazara/3D/3D.cpp @@ -18,6 +18,8 @@ bool Nz3D::Initialize() if (!NzRenderer::Initialize()) { NazaraError("Failed to initialize renderer module"); + Uninitialize(); + return false; } diff --git a/src/Nazara/Audio/Audio.cpp b/src/Nazara/Audio/Audio.cpp index 2d14bd59f..ceb66a9c2 100644 --- a/src/Nazara/Audio/Audio.cpp +++ b/src/Nazara/Audio/Audio.cpp @@ -108,6 +108,8 @@ bool NzAudio::Initialize() if (!NzCore::Initialize()) { NazaraError("Failed to initialize core module"); + Uninitialize(); + return false; } @@ -116,6 +118,8 @@ bool NzAudio::Initialize() if (!device) { NazaraError("Failed to open default device"); + Uninitialize(); + return false; } @@ -124,17 +128,16 @@ bool NzAudio::Initialize() if (!context) { NazaraError("Failed to create context"); + Uninitialize(); - alcCloseDevice(device); return false; } if (!alcMakeContextCurrent(context)) { NazaraError("Failed to activate context"); + Uninitialize(); - alcDestroyContext(context); - alcCloseDevice(device); return false; } @@ -269,12 +272,18 @@ void NzAudio::Uninitialize() NzLoaders_sndfile_Unregister(); // Libération d'OpenAL - alcMakeContextCurrent(nullptr); - alcDestroyContext(context); + if (device) + { + if (context) + { + alcMakeContextCurrent(nullptr); + alcDestroyContext(context); + } - if (!alcCloseDevice(device)) - // Nous n'avons pas pu fermer le device, ce qui signifie qu'il est en cours d'utilisation - NazaraWarning("Failed to close device"); + if (!alcCloseDevice(device)) + // Nous n'avons pas pu fermer le device, ce qui signifie qu'il est en cours d'utilisation + NazaraWarning("Failed to close device"); + } NazaraNotice("Uninitialized: Audio module"); diff --git a/src/Nazara/Core/Core.cpp b/src/Nazara/Core/Core.cpp index a2edb39af..75c143c16 100644 --- a/src/Nazara/Core/Core.cpp +++ b/src/Nazara/Core/Core.cpp @@ -22,6 +22,8 @@ bool NzCore::Initialize(bool initializeHardwareInfo, bool initializeTaskSchedule if (initializeTaskScheduler && !NzTaskScheduler::Initialize()) { NazaraError("Failed to initialize task scheduler"); + Uninitialize(); + return false; } diff --git a/src/Nazara/Noise/Noise.cpp b/src/Nazara/Noise/Noise.cpp index 5e7c58067..d99686ce9 100644 --- a/src/Nazara/Noise/Noise.cpp +++ b/src/Nazara/Noise/Noise.cpp @@ -18,6 +18,8 @@ bool NzNoise::Initialize() if (!NzCore::Initialize()) { NazaraError("Failed to initialize core module"); + Uninitialize(); + return false; } diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index ecf549568..14d5874b3 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -466,7 +466,13 @@ bool NzRenderer::Initialize(bool initializeDebugDrawer) if (initializeDebugDrawer && !NzDebugDrawer::Initialize()) NazaraWarning("Failed to initialize debug drawer"); // Non-critique - NzTextureSampler::Initialize(); + if (!NzTextureSampler::Initialize()) + { + NazaraError("Failed to initialize texture sampler"); + Uninitialize(); + + return false; + } // Loaders NzLoaders_Texture_Register(); diff --git a/src/Nazara/Utility/Utility.cpp b/src/Nazara/Utility/Utility.cpp index 42d0dec92..6f843901c 100644 --- a/src/Nazara/Utility/Utility.cpp +++ b/src/Nazara/Utility/Utility.cpp @@ -26,6 +26,8 @@ bool NzUtility::Initialize() if (!NzCore::Initialize()) { NazaraError("Failed to initialize core module"); + Uninitialize(); + return false; } @@ -33,19 +35,23 @@ bool NzUtility::Initialize() if (!NzBuffer::Initialize()) { NazaraError("Failed to initialize buffers"); + Uninitialize(); + return false; } if (!NzPixelFormat::Initialize()) { NazaraError("Failed to initialize pixel formats"); + Uninitialize(); + return false; } if (!NzWindow::Initialize()) { NazaraError("Failed to initialize window's system"); - NzPixelFormat::Uninitialize(); + Uninitialize(); return false; }