diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2023-05-19 19:24:31 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-19 19:24:31 +0200 |
| commit | 82ecbbe7953af9d07b8899e8a59e91aed409d93d (patch) | |
| tree | 1e8754c5f0667cbcf2268ab305e725166acfccca /Source/Core | |
| parent | b0d7fa9eb11676cf5ade0a0f5a9a3a07e3bd7224 (diff) | |
| parent | 8342164dbdf6d862556de017f67ff28ecde0f0ec (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.h | 5 | ||||
| -rw-r--r-- | Source/Core/Common/MemArenaAndroid.cpp | 7 | ||||
| -rw-r--r-- | Source/Core/Common/MemArenaUnix.cpp | 6 | ||||
| -rw-r--r-- | Source/Core/Common/MemArenaWin.cpp | 26 | ||||
| -rw-r--r-- | Source/Core/Core/HW/Memmap.cpp | 2 |
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); |
