From a13364190053043acf39a84ed125800102667dbc Mon Sep 17 00:00:00 2001 From: ohyzha Date: Mon, 11 Nov 2024 18:19:06 +0200 Subject: [PATCH 1/4] make it possible to close memmapped file before dctor --- openVulkanoCpp/IO/MemMappedFile.cpp | 5 +++++ openVulkanoCpp/IO/MemMappedFile.hpp | 2 ++ openVulkanoCpp/IO/MemMappedFileInternal.cpp | 22 +++++++++++++++++++-- openVulkanoCpp/IO/MemMappedFileInternal.hpp | 2 ++ 4 files changed, 29 insertions(+), 2 deletions(-) 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; From d88addd85805b4fd632d88c79486193308af1feb Mon Sep 17 00:00:00 2001 From: ohyzha Date: Mon, 11 Nov 2024 21:17:16 +0200 Subject: [PATCH 2/4] nullify everything on close --- openVulkanoCpp/IO/MemMappedFile.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openVulkanoCpp/IO/MemMappedFile.cpp b/openVulkanoCpp/IO/MemMappedFile.cpp index 10e9157..ffa7e4f 100644 --- a/openVulkanoCpp/IO/MemMappedFile.cpp +++ b/openVulkanoCpp/IO/MemMappedFile.cpp @@ -22,5 +22,8 @@ namespace OpenVulkano void MemMappedFile::Close() { m_internal->Close(); + m_internal = nullptr; + m_data = nullptr; + m_size = 0; } } From 656615e5a7fc47b42e2227ffe4e3fc4d15ddac15 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Wed, 13 Nov 2024 10:24:34 +0200 Subject: [PATCH 3/4] get rid of internal Close() method --- openVulkanoCpp/IO/MemMappedFile.cpp | 10 ++++++++-- openVulkanoCpp/IO/MemMappedFileInternal.cpp | 22 ++------------------- openVulkanoCpp/IO/MemMappedFileInternal.hpp | 2 -- 3 files changed, 10 insertions(+), 24 deletions(-) diff --git a/openVulkanoCpp/IO/MemMappedFile.cpp b/openVulkanoCpp/IO/MemMappedFile.cpp index ffa7e4f..56a453d 100644 --- a/openVulkanoCpp/IO/MemMappedFile.cpp +++ b/openVulkanoCpp/IO/MemMappedFile.cpp @@ -21,8 +21,14 @@ namespace OpenVulkano void MemMappedFile::Close() { - m_internal->Close(); - m_internal = nullptr; + if (m_internal.use_count() == 1) + { + m_internal = nullptr; + } + else + { + Logger::APP->warn("Can't close memory mapped file since it's being shared among {} instances", m_internal.use_count()); + } m_data = nullptr; m_size = 0; } diff --git a/openVulkanoCpp/IO/MemMappedFileInternal.cpp b/openVulkanoCpp/IO/MemMappedFileInternal.cpp index de69c97..460552e 100644 --- a/openVulkanoCpp/IO/MemMappedFileInternal.cpp +++ b/openVulkanoCpp/IO/MemMappedFileInternal.cpp @@ -90,20 +90,11 @@ namespace OpenVulkano } } - void MemMappedFileInternal::Close() + MemMappedFileInternal::~MemMappedFileInternal() { UnmapViewOfFile(address); CloseHandle(fileMappingHandle); CloseHandle(fileHandle); - closed = true; - } - - MemMappedFileInternal::~MemMappedFileInternal() - { - if (!closed) - { - Close(); - } } #else MemMappedFileInternal::MemMappedFileInternal(const char* file, MemMappedFile::FileMode fileMode) @@ -123,19 +114,10 @@ namespace OpenVulkano size = fileStat.st_size; } - void MemMappedFileInternal::Close() + MemMappedFileInternal::~MemMappedFileInternal() { 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 a4320fa..2d7852b 100644 --- a/openVulkanoCpp/IO/MemMappedFileInternal.hpp +++ b/openVulkanoCpp/IO/MemMappedFileInternal.hpp @@ -34,12 +34,10 @@ 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; From c1588fc5508a11a70d5eea5b949483a732e4791d Mon Sep 17 00:00:00 2001 From: ohyzha Date: Thu, 14 Nov 2024 17:37:08 +0200 Subject: [PATCH 4/4] warning when use count != 1 --- openVulkanoCpp/IO/MemMappedFile.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/openVulkanoCpp/IO/MemMappedFile.cpp b/openVulkanoCpp/IO/MemMappedFile.cpp index 56a453d..6e337f7 100644 --- a/openVulkanoCpp/IO/MemMappedFile.cpp +++ b/openVulkanoCpp/IO/MemMappedFile.cpp @@ -21,14 +21,11 @@ namespace OpenVulkano void MemMappedFile::Close() { - if (m_internal.use_count() == 1) + if (m_internal.use_count() != 1) { - m_internal = nullptr; - } - else - { - Logger::APP->warn("Can't close memory mapped file since it's being shared among {} instances", m_internal.use_count()); + Logger::APP->warn("Closing memory mapped file with {} usages", m_internal.use_count()); } + m_internal = nullptr; m_data = nullptr; m_size = 0; }