Made Buffer::SetStorage exception-safe
Former-commit-id: 46e9f9416aa3bd93e130f784a42d23533ec60dea
This commit is contained in:
parent
0f033eaed9
commit
0d143a64a2
|
|
@ -3,6 +3,7 @@
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
#include <Nazara/Utility/Buffer.hpp>
|
#include <Nazara/Utility/Buffer.hpp>
|
||||||
|
#include <Nazara/Core/CallOnExit.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
#include <Nazara/Core/ErrorFlags.hpp>
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
#include <Nazara/Utility/AbstractBuffer.hpp>
|
#include <Nazara/Utility/AbstractBuffer.hpp>
|
||||||
|
|
@ -225,31 +226,36 @@ bool NzBuffer::SetStorage(nzDataStorage storage)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
NzAbstractBuffer* impl = s_bufferFactories[storage](this, m_type);
|
NzCallOnExit unmapMyImpl([this]()
|
||||||
|
{
|
||||||
|
m_impl->Unmap();
|
||||||
|
});
|
||||||
|
|
||||||
|
std::unique_ptr<NzAbstractBuffer> impl(s_bufferFactories[storage](this, m_type));
|
||||||
if (!impl->Create(m_size, m_usage))
|
if (!impl->Create(m_size, m_usage))
|
||||||
{
|
{
|
||||||
NazaraError("Failed to create buffer");
|
NazaraError("Failed to create buffer");
|
||||||
delete impl;
|
|
||||||
m_impl->Unmap();
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NzCallOnExit destroyImpl([&impl]()
|
||||||
|
{
|
||||||
|
impl->Destroy();
|
||||||
|
});
|
||||||
|
|
||||||
if (!impl->Fill(ptr, 0, m_size))
|
if (!impl->Fill(ptr, 0, m_size))
|
||||||
{
|
{
|
||||||
NazaraError("Failed to fill buffer");
|
NazaraError("Failed to fill buffer");
|
||||||
impl->Destroy();
|
|
||||||
delete impl;
|
|
||||||
m_impl->Unmap();
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_impl->Unmap();
|
destroyImpl.Reset();
|
||||||
|
|
||||||
|
unmapMyImpl.CallAndReset();
|
||||||
m_impl->Destroy();
|
m_impl->Destroy();
|
||||||
delete m_impl;
|
delete m_impl;
|
||||||
|
|
||||||
m_impl = impl;
|
m_impl = impl.release();
|
||||||
m_storage = storage;
|
m_storage = storage;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue