diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2023-05-19 18:42:33 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-19 18:42:33 +0200 |
| commit | b0d7fa9eb11676cf5ade0a0f5a9a3a07e3bd7224 (patch) | |
| tree | 3aa99367d7cf59974ed2e287a546575b3384039d /Source/Core/Common/MemArenaAndroid.cpp | |
| parent | 11768e3dd3e998bb874c919b96ae775826d6bd86 (diff) | |
| parent | ab98db445d67491ac63196686b73fb279f71984f (diff) | |
Merge pull request #11823 from AdmiralCurtiss/mmap-android
Common/MemArenaAndroid: Keep fastmem region mapped.
Diffstat (limited to 'Source/Core/Common/MemArenaAndroid.cpp')
| -rw-r--r-- | Source/Core/Common/MemArenaAndroid.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/Source/Core/Common/MemArenaAndroid.cpp b/Source/Core/Common/MemArenaAndroid.cpp index aca94db173..721925d213 100644 --- a/Source/Core/Common/MemArenaAndroid.cpp +++ b/Source/Core/Common/MemArenaAndroid.cpp @@ -64,24 +64,33 @@ MemArena::~MemArena() = default; void MemArena::GrabSHMSegment(size_t size) { - fd = AshmemCreateFileMapping(("dolphin-emu." + std::to_string(getpid())).c_str(), size); - if (fd < 0) + m_shm_fd = AshmemCreateFileMapping(("dolphin-emu." + std::to_string(getpid())).c_str(), size); + if (m_shm_fd < 0) NOTICE_LOG_FMT(MEMMAP, "Ashmem allocation failed"); } void MemArena::ReleaseSHMSegment() { - close(fd); + close(m_shm_fd); } void* MemArena::CreateView(s64 offset, size_t size) { - return MapInMemoryRegion(offset, size, nullptr); + void* retval = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, m_shm_fd, offset); + if (retval == MAP_FAILED) + { + NOTICE_LOG_FMT(MEMMAP, "mmap failed"); + return nullptr; + } + else + { + return retval; + } } void MemArena::ReleaseView(void* view, size_t size) { - UnmapFromMemoryRegion(view, size); + munmap(view, size); } u8* MemArena::ReserveMemoryRegion(size_t memory_size) @@ -96,19 +105,23 @@ u8* MemArena::ReserveMemoryRegion(size_t memory_size) PanicAlertFmt("Failed to map enough memory space: {}", LastStrerrorString()); return nullptr; } - munmap(base, memory_size); + m_reserved_region = base; + m_reserved_region_size = memory_size; return static_cast<u8*>(base); } void MemArena::ReleaseMemoryRegion() { + if (m_reserved_region) + { + munmap(m_reserved_region, m_reserved_region_size); + m_reserved_region = nullptr; + } } void* MemArena::MapInMemoryRegion(s64 offset, size_t size, void* base) { - void* retval = mmap(base, size, PROT_READ | PROT_WRITE, - MAP_SHARED | ((base == nullptr) ? 0 : MAP_FIXED), fd, offset); - + void* retval = mmap(base, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, m_shm_fd, offset); if (retval == MAP_FAILED) { NOTICE_LOG_FMT(MEMMAP, "mmap failed"); @@ -122,6 +135,8 @@ void* MemArena::MapInMemoryRegion(s64 offset, size_t size, void* base) void MemArena::UnmapFromMemoryRegion(void* view, size_t size) { - munmap(view, size); + void* retval = mmap(view, size, PROT_NONE, MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + if (retval == MAP_FAILED) + NOTICE_LOG_FMT(MEMMAP, "mmap failed"); } } // namespace Common |
