mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-05-02 10:14:57 +00:00
Merge pull request #11822 from AdmiralCurtiss/win-large-memarena
Common/MemArenaWin: Improve file mapping logic.
This commit is contained in:
commit
82ecbbe795
5 changed files with 34 additions and 12 deletions
|
@ -4,6 +4,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <string_view>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
@ -34,8 +35,10 @@ public:
|
||||||
/// CreateView() and ReleaseView(). Used to make a mappable region for emulated memory.
|
/// 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 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().
|
/// Release the memory segment previously allocated with GrabSHMSegment().
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <linux/ashmem.h>
|
#include <linux/ashmem.h>
|
||||||
|
@ -62,9 +64,10 @@ static int AshmemCreateFileMapping(const char* name, size_t size)
|
||||||
MemArena::MemArena() = default;
|
MemArena::MemArena() = default;
|
||||||
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)
|
if (m_shm_fd < 0)
|
||||||
NOTICE_LOG_FMT(MEMMAP, "Ashmem allocation failed");
|
NOTICE_LOG_FMT(MEMMAP, "Ashmem allocation failed");
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -25,9 +27,9 @@ namespace Common
|
||||||
MemArena::MemArena() = default;
|
MemArena::MemArena() = default;
|
||||||
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);
|
m_shm_fd = shm_open(file_name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||||
if (m_shm_fd == -1)
|
if (m_shm_fd == -1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "Common/Assert.h"
|
#include "Common/Assert.h"
|
||||||
|
@ -97,11 +99,22 @@ MemArena::~MemArena()
|
||||||
ReleaseSHMSegment();
|
ReleaseSHMSegment();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemArena::GrabSHMSegment(size_t size)
|
static DWORD GetHighDWORD(u64 value)
|
||||||
{
|
{
|
||||||
const std::string name = "dolphin-emu." + std::to_string(GetCurrentProcessId());
|
return static_cast<DWORD>(value >> 32);
|
||||||
m_memory_handle = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0,
|
}
|
||||||
static_cast<DWORD>(size), UTF8ToTStr(name).c_str());
|
|
||||||
|
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 = 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()
|
void MemArena::ReleaseSHMSegment()
|
||||||
|
@ -114,8 +127,9 @@ void MemArena::ReleaseSHMSegment()
|
||||||
|
|
||||||
void* MemArena::CreateView(s64 offset, size_t size)
|
void* MemArena::CreateView(s64 offset, size_t size)
|
||||||
{
|
{
|
||||||
return MapViewOfFileEx(m_memory_handle, FILE_MAP_ALL_ACCESS, 0, (DWORD)((u64)offset), size,
|
const u64 off = static_cast<u64>(offset);
|
||||||
nullptr);
|
return MapViewOfFileEx(m_memory_handle, FILE_MAP_ALL_ACCESS, GetHighDWORD(off), GetLowDWORD(off),
|
||||||
|
size, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemArena::ReleaseView(void* view, size_t size)
|
void MemArena::ReleaseView(void* view, size_t size)
|
||||||
|
|
|
@ -121,7 +121,7 @@ void MemoryManager::Init()
|
||||||
region.active = true;
|
region.active = true;
|
||||||
mem_size += region.size;
|
mem_size += region.size;
|
||||||
}
|
}
|
||||||
m_arena.GrabSHMSegment(mem_size);
|
m_arena.GrabSHMSegment(mem_size, "dolphin-emu");
|
||||||
|
|
||||||
m_physical_page_mappings.fill(nullptr);
|
m_physical_page_mappings.fill(nullptr);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue