aboutsummaryrefslogtreecommitdiff
path: root/src/common/sparse_large_vector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/sparse_large_vector.cpp')
-rw-r--r--src/common/sparse_large_vector.cpp15
1 files changed, 15 insertions, 0 deletions
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<LPVOID>(base), HostPageSize, MEM_DECOMMIT);
+#elif defined(__linux__)
+ // Linux's MADV_DONTNEED zeros out pages for us
+ madvise(reinterpret_cast<void*>(base), HostPageSize, MADV_DONTNEED);
+#else
+ madvise(reinterpret_cast<void*>(base), HostPageSize, MADV_FREE);
+ std::memset(reinterpret_cast<void*>(base), 0, HostPageSize);
+#endif
+}
void* AllocateMemoryPages(std::size_t size) noexcept {
if (auto page = HostPageSize; size % page != 0) {