diff options
Diffstat (limited to 'deps/v8/src/base/platform/platform-cygwin.cc')
-rw-r--r-- | deps/v8/src/base/platform/platform-cygwin.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/deps/v8/src/base/platform/platform-cygwin.cc b/deps/v8/src/base/platform/platform-cygwin.cc index c5d94fc6ba..f2976301ed 100644 --- a/deps/v8/src/base/platform/platform-cygwin.cc +++ b/deps/v8/src/base/platform/platform-cygwin.cc @@ -172,6 +172,33 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) { } // static +bool OS::DiscardSystemPages(void* address, size_t size) { + // On Windows, discarded pages are not returned to the system immediately and + // not guaranteed to be zeroed when returned to the application. + using DiscardVirtualMemoryFunction = + DWORD(WINAPI*)(PVOID virtualAddress, SIZE_T size); + static std::atomic<DiscardVirtualMemoryFunction> discard_virtual_memory( + reinterpret_cast<DiscardVirtualMemoryFunction>(-1)); + if (discard_virtual_memory == + reinterpret_cast<DiscardVirtualMemoryFunction>(-1)) + discard_virtual_memory = + reinterpret_cast<DiscardVirtualMemoryFunction>(GetProcAddress( + GetModuleHandle(L"Kernel32.dll"), "DiscardVirtualMemory")); + // Use DiscardVirtualMemory when available because it releases faster than + // MEM_RESET. + DiscardVirtualMemoryFunction discard_function = discard_virtual_memory.load(); + if (discard_function) { + DWORD ret = discard_function(address, size); + if (!ret) return true; + } + // DiscardVirtualMemory is buggy in Win10 SP0, so fall back to MEM_RESET on + // failure. + void* ptr = VirtualAlloc(address, size, MEM_RESET, PAGE_READWRITE); + CHECK(ptr); + return ptr; +} + +// static bool OS::HasLazyCommits() { // TODO(alph): implement for the platform. return false; |