summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-05-19 19:24:31 +0200
committerGitHub <noreply@github.com>2023-05-19 19:24:31 +0200
commit82ecbbe7953af9d07b8899e8a59e91aed409d93d (patch)
tree1e8754c5f0667cbcf2268ab305e725166acfccca /Source/Core
parentb0d7fa9eb11676cf5ade0a0f5a9a3a07e3bd7224 (diff)
parent8342164dbdf6d862556de017f67ff28ecde0f0ec (diff)
Merge pull request #11822 from AdmiralCurtiss/win-large-memarena
Common/MemArenaWin: Improve file mapping logic.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/MemArena.h5
-rw-r--r--Source/Core/Common/MemArenaAndroid.cpp7
-rw-r--r--Source/Core/Common/MemArenaUnix.cpp6
-rw-r--r--Source/Core/Common/MemArenaWin.cpp26
-rw-r--r--Source/Core/Core/HW/Memmap.cpp2
5 files changed, 34 insertions, 12 deletions
diff --git a/Source/Core/Common/MemArena.h b/Source/Core/Common/MemArena.h
index 01b1b5c06b..adb944acf9 100644
--- a/Source/Core/Common/MemArena.h
+++ b/Source/Core/Common/MemArena.h
@@ -4,6 +4,7 @@
#pragma once
#include <cstddef>
+#include <string_view>
#include <vector>
#include "Common/CommonTypes.h"
@@ -34,8 +35,10 @@ public:
/// CreateView() and ReleaseView(). Used to make a mappable region for emulated memory.
///
/// @param size The amount of bytes that should be allocated in this region.
+ /// @param base_name A base name for the shared memory region, if applicable for this platform.
+ /// Will be extended with the process ID.
///
- void GrabSHMSegment(size_t size);
+ void GrabSHMSegment(size_t size, std::string_view base_name);
///
/// Release the memory segment previously allocated with GrabSHMSegment().
diff --git a/Source/Core/Common/MemArenaAndroid.cpp b/Source/Core/Common/MemArenaAndroid.cpp
index 721925d213..01b210100a 100644
--- a/Source/Core/Common/MemArenaAndroid.cpp
+++ b/Source/Core/Common/MemArenaAndroid.cpp
@@ -10,6 +10,8 @@
#include <set>
#include <string>
+#include <fmt/format.h>
+
#include <dlfcn.h>
#include <fcntl.h>
#include <linux/ashmem.h>
@@ -62,9 +64,10 @@ static int AshmemCreateFileMapping(const char* name, size_t size)
MemArena::MemArena() = default;
MemArena::~MemArena() = default;
-void MemArena::GrabSHMSegment(size_t size)
+void MemArena::GrabSHMSegment(size_t size, std::string_view base_name)
{
- m_shm_fd = AshmemCreateFileMapping(("dolphin-emu." + std::to_string(getpid())).c_str(), size);
+ const std::string name = fmt::format("{}.{}", base_name, getpid());
+ m_shm_fd = AshmemCreateFileMapping(name.c_str(), size);
if (m_shm_fd < 0)
NOTICE_LOG_FMT(MEMMAP, "Ashmem allocation failed");
}
diff --git a/Source/Core/Common/MemArenaUnix.cpp b/Source/Core/Common/MemArenaUnix.cpp
index 549ce09cfd..1532699276 100644
--- a/Source/Core/Common/MemArenaUnix.cpp
+++ b/Source/Core/Common/MemArenaUnix.cpp
@@ -10,6 +10,8 @@
#include <set>
#include <string>
+#include <fmt/format.h>
+
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
@@ -25,9 +27,9 @@ namespace Common
MemArena::MemArena() = default;
MemArena::~MemArena() = default;
-void MemArena::GrabSHMSegment(size_t size)
+void MemArena::GrabSHMSegment(size_t size, std::string_view base_name)
{
- const std::string file_name = "/dolphin-emu." + std::to_string(getpid());
+ const std::string file_name = fmt::format("/{}.{}", base_name, getpid());
m_shm_fd = shm_open(file_name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
if (m_shm_fd == -1)
{
diff --git a/Source/Core/Common/MemArenaWin.cpp b/Source/Core/Common/MemArenaWin.cpp
index 1e2de701c5..9d4a88d54a 100644
--- a/Source/Core/Common/MemArenaWin.cpp
+++ b/Source/Core/Common/MemArenaWin.cpp
@@ -8,6 +8,8 @@
#include <cstdlib>
#include <string>
+#include <fmt/format.h>
+
#include <windows.h>
#include "Common/Assert.h"
@@ -97,11 +99,22 @@ MemArena::~MemArena()
ReleaseSHMSegment();
}
-void MemArena::GrabSHMSegment(size_t size)
+static DWORD GetHighDWORD(u64 value)
+{
+ return static_cast<DWORD>(value >> 32);
+}
+
+static DWORD GetLowDWORD(u64 value)
+{
+ return static_cast<DWORD>(value);
+}
+
+void MemArena::GrabSHMSegment(size_t size, std::string_view base_name)
{
- const std::string name = "dolphin-emu." + std::to_string(GetCurrentProcessId());
- m_memory_handle = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0,
- static_cast<DWORD>(size), UTF8ToTStr(name).c_str());
+ const std::string name = fmt::format("{}.{}", base_name, GetCurrentProcessId());
+ m_memory_handle =
+ CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, GetHighDWORD(size),
+ GetLowDWORD(size), UTF8ToTStr(name).c_str());
}
void MemArena::ReleaseSHMSegment()
@@ -114,8 +127,9 @@ void MemArena::ReleaseSHMSegment()
void* MemArena::CreateView(s64 offset, size_t size)
{
- return MapViewOfFileEx(m_memory_handle, FILE_MAP_ALL_ACCESS, 0, (DWORD)((u64)offset), size,
- nullptr);
+ const u64 off = static_cast<u64>(offset);
+ return MapViewOfFileEx(m_memory_handle, FILE_MAP_ALL_ACCESS, GetHighDWORD(off), GetLowDWORD(off),
+ size, nullptr);
}
void MemArena::ReleaseView(void* view, size_t size)
diff --git a/Source/Core/Core/HW/Memmap.cpp b/Source/Core/Core/HW/Memmap.cpp
index 5a63405d17..d66f77febf 100644
--- a/Source/Core/Core/HW/Memmap.cpp
+++ b/Source/Core/Core/HW/Memmap.cpp
@@ -121,7 +121,7 @@ void MemoryManager::Init()
region.active = true;
mem_size += region.size;
}
- m_arena.GrabSHMSegment(mem_size);
+ m_arena.GrabSHMSegment(mem_size, "dolphin-emu");
m_physical_page_mappings.fill(nullptr);