From 0d143a64a2f3c108fef9f0c4b25e8cd81eb4d8f7 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 4 Jan 2015 19:02:35 +0100 Subject: [PATCH] Made Buffer::SetStorage exception-safe Former-commit-id: 46e9f9416aa3bd93e130f784a42d23533ec60dea --- src/Nazara/Utility/Buffer.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Nazara/Utility/Buffer.cpp b/src/Nazara/Utility/Buffer.cpp index c35f8bf70..71b568f5b 100644 --- a/src/Nazara/Utility/Buffer.cpp +++ b/src/Nazara/Utility/Buffer.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include @@ -225,31 +226,36 @@ bool NzBuffer::SetStorage(nzDataStorage storage) return false; } - NzAbstractBuffer* impl = s_bufferFactories[storage](this, m_type); + NzCallOnExit unmapMyImpl([this]() + { + m_impl->Unmap(); + }); + + std::unique_ptr impl(s_bufferFactories[storage](this, m_type)); if (!impl->Create(m_size, m_usage)) { NazaraError("Failed to create buffer"); - delete impl; - m_impl->Unmap(); - return false; } + NzCallOnExit destroyImpl([&impl]() + { + impl->Destroy(); + }); + if (!impl->Fill(ptr, 0, m_size)) { NazaraError("Failed to fill buffer"); - impl->Destroy(); - delete impl; - m_impl->Unmap(); - return false; } - m_impl->Unmap(); + destroyImpl.Reset(); + + unmapMyImpl.CallAndReset(); m_impl->Destroy(); delete m_impl; - m_impl = impl; + m_impl = impl.release(); m_storage = storage; return true;