aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/base/platform/platform-cygwin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/base/platform/platform-cygwin.cc')
-rw-r--r--deps/v8/src/base/platform/platform-cygwin.cc27
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;