From 38df54edfe7b861d0a0a1ee305836049a39d42ef Mon Sep 17 00:00:00 2001 From: Exverge Date: Wed, 23 Sep 2026 13:52:29 +0200 Subject: [common/sparse_large_vector] decommit unused pages + fix first page in zeroed region (#4471) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Fixes a bug where the first page of a zeroed out region would not be properly zeroed, and now frees unused memory. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4471 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/common/sparse_large_vector.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/common/sparse_large_vector.cpp') diff --git a/src/common/sparse_large_vector.cpp b/src/common/sparse_large_vector.cpp index ce6455a235..745575a880 100644 --- a/src/common/sparse_large_vector.cpp +++ b/src/common/sparse_large_vector.cpp @@ -96,6 +96,21 @@ bool CommitVectorPage(uintptr_t addr, bool write) noexcept { #ifndef MAP_NOCORE #define MAP_NOCORE 0 #endif +#ifndef MADV_FREE +#define MADV_FREE MADV_DONTNEED +#endif + +void DecommitVectorPage(uintptr_t base) noexcept { +#if defined(_WIN32) + VirtualFree(reinterpret_cast(base), HostPageSize, MEM_DECOMMIT); +#elif defined(__linux__) + // Linux's MADV_DONTNEED zeros out pages for us + madvise(reinterpret_cast(base), HostPageSize, MADV_DONTNEED); +#else + madvise(reinterpret_cast(base), HostPageSize, MADV_FREE); + std::memset(reinterpret_cast(base), 0, HostPageSize); +#endif +} void* AllocateMemoryPages(std::size_t size) noexcept { if (auto page = HostPageSize; size % page != 0) { -- cgit v1.2.3