summaryrefslogtreecommitdiff
path: root/Source/Core/Common/MemArenaUnix.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2023-09-02 12:37:13 -0400
committerGitHub <noreply@github.com>2023-09-02 12:37:13 -0400
commit6beaee078baeaa80f9f1c21ce372ce28fd8273b6 (patch)
treea0a45e35d77c1c14f0f52721e05cd6175d271a47 /Source/Core/Common/MemArenaUnix.cpp
parent5e5887a378db28324a8fc8825f21539525412e12 (diff)
parentf1c1c6ded690b34c8e5add75fecc96fff00848e5 (diff)
Merge pull request #12150 from AdmiralCurtiss/fast-block-cache-fix
JitCache: Fix potentially dangling pointer to fast block map.
Diffstat (limited to 'Source/Core/Common/MemArenaUnix.cpp')
-rw-r--r--Source/Core/Common/MemArenaUnix.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/Source/Core/Common/MemArenaUnix.cpp b/Source/Core/Common/MemArenaUnix.cpp
index 1532699276..452c2c50c8 100644
--- a/Source/Core/Common/MemArenaUnix.cpp
+++ b/Source/Core/Common/MemArenaUnix.cpp
@@ -16,6 +16,7 @@
#include <sys/mman.h>
#include <unistd.h>
+#include "Common/Assert.h"
#include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h"
#include "Common/Logging/Log.h"
@@ -108,4 +109,46 @@ void MemArena::UnmapFromMemoryRegion(void* view, size_t size)
if (retval == MAP_FAILED)
NOTICE_LOG_FMT(MEMMAP, "mmap failed");
}
+
+LazyMemoryRegion::LazyMemoryRegion() = default;
+
+LazyMemoryRegion::~LazyMemoryRegion()
+{
+ Release();
+}
+
+void* LazyMemoryRegion::Create(size_t size)
+{
+ ASSERT(!m_memory);
+
+ void* memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (!memory)
+ {
+ NOTICE_LOG_FMT(MEMMAP, "Memory allocation of {} bytes failed.", size);
+ return nullptr;
+ }
+
+ m_memory = memory;
+ m_size = size;
+
+ return memory;
+}
+
+void LazyMemoryRegion::Clear()
+{
+ ASSERT(m_memory);
+
+ mmap(m_memory, m_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+}
+
+void LazyMemoryRegion::Release()
+{
+ if (m_memory)
+ {
+ munmap(m_memory, m_size);
+ m_memory = nullptr;
+ m_size = 0;
+ }
+}
+
} // namespace Common