diff --git a/openVulkanoCpp/IO/MemMappedFile.cpp b/openVulkanoCpp/IO/MemMappedFile.cpp index dbb6963..10e9157 100644 --- a/openVulkanoCpp/IO/MemMappedFile.cpp +++ b/openVulkanoCpp/IO/MemMappedFile.cpp @@ -18,4 +18,9 @@ namespace OpenVulkano m_data = m_internal->address; m_size = (m_data) ? m_internal->size : 0; } + + void MemMappedFile::Close() + { + m_internal->Close(); + } } diff --git a/openVulkanoCpp/IO/MemMappedFile.hpp b/openVulkanoCpp/IO/MemMappedFile.hpp index e007564..70f2469 100644 --- a/openVulkanoCpp/IO/MemMappedFile.hpp +++ b/openVulkanoCpp/IO/MemMappedFile.hpp @@ -38,5 +38,7 @@ namespace OpenVulkano [[nodiscard]] size_t Size() const { return m_size; } [[nodiscard]] void* Data() const { return m_data; } + + void Close(); }; } \ No newline at end of file diff --git a/openVulkanoCpp/IO/MemMappedFileInternal.cpp b/openVulkanoCpp/IO/MemMappedFileInternal.cpp index 460552e..de69c97 100644 --- a/openVulkanoCpp/IO/MemMappedFileInternal.cpp +++ b/openVulkanoCpp/IO/MemMappedFileInternal.cpp @@ -90,11 +90,20 @@ namespace OpenVulkano } } - MemMappedFileInternal::~MemMappedFileInternal() + void MemMappedFileInternal::Close() { UnmapViewOfFile(address); CloseHandle(fileMappingHandle); CloseHandle(fileHandle); + closed = true; + } + + MemMappedFileInternal::~MemMappedFileInternal() + { + if (!closed) + { + Close(); + } } #else MemMappedFileInternal::MemMappedFileInternal(const char* file, MemMappedFile::FileMode fileMode) @@ -114,10 +123,19 @@ namespace OpenVulkano size = fileStat.st_size; } - MemMappedFileInternal::~MemMappedFileInternal() + void MemMappedFileInternal::Close() { munmap(address, fileStat.st_size); close(fileHandle); + closed = true; + } + + MemMappedFileInternal::~MemMappedFileInternal() + { + if (!closed) + { + Close(); + } } #endif diff --git a/openVulkanoCpp/IO/MemMappedFileInternal.hpp b/openVulkanoCpp/IO/MemMappedFileInternal.hpp index 2d7852b..a4320fa 100644 --- a/openVulkanoCpp/IO/MemMappedFileInternal.hpp +++ b/openVulkanoCpp/IO/MemMappedFileInternal.hpp @@ -34,10 +34,12 @@ namespace OpenVulkano #else [[nodiscard]] bool InvalidHandle() const { return fileHandle == -1; } #endif + void Close(); private: void* address = nullptr; size_t size = 0; + bool closed = false; #ifdef _MSC_VER HANDLE fileHandle;