Bug 1578501 [wpt PR 18803] - WebKit export of https://bugs.webkit.org/show_bug.cgi...
[gecko.git] / xpcom / glue / MemUtils.cpp
blob531a5ea2f52561fd2f25512819d1a301bad8e072
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/MemUtils.h"
9 #if defined(XP_WIN)
10 # include <windows.h>
11 # include "mozilla/Maybe.h"
12 #else
13 # include <sys/mman.h>
14 #endif
16 #if defined(XP_WIN)
17 typedef BOOL(WINAPI* PrefetchVirtualMemoryFn)(HANDLE, ULONG_PTR, PVOID, ULONG);
19 static mozilla::Maybe<PrefetchVirtualMemoryFn> sPrefetchVirtualMemory;
21 void MaybeInitPrefetchVirtualMemory() {
22 if (sPrefetchVirtualMemory.isNothing()) {
23 sPrefetchVirtualMemory.emplace(
24 reinterpret_cast<PrefetchVirtualMemoryFn>(GetProcAddress(
25 GetModuleHandleW(L"kernel32.dll"), "PrefetchVirtualMemory")));
28 #endif
30 bool mozilla::CanPrefetchMemory() {
31 #if defined(XP_SOLARIS) || defined(XP_UNIX)
32 return true;
33 #elif defined(XP_WIN)
34 MaybeInitPrefetchVirtualMemory();
35 return *sPrefetchVirtualMemory;
36 #else
37 return false;
38 #endif
41 void mozilla::PrefetchMemory(uint8_t* aStart, size_t aNumBytes) {
42 if (aNumBytes == 0) {
43 return;
46 #if defined(XP_SOLARIS)
47 posix_madvise(aStart, aNumBytes, POSIX_MADV_WILLNEED);
48 #elif defined(XP_UNIX)
49 madvise(aStart, aNumBytes, MADV_WILLNEED);
50 #elif defined(XP_WIN)
51 MaybeInitPrefetchVirtualMemory();
52 if (*sPrefetchVirtualMemory) {
53 // Normally, we'd use WIN32_MEMORY_RANGE_ENTRY, but that requires
54 // a different _WIN32_WINNT value before including windows.h, but
55 // that causes complications with unified sources. It's a simple
56 // enough struct anyways.
57 struct {
58 PVOID VirtualAddress;
59 SIZE_T NumberOfBytes;
60 } entry;
61 entry.VirtualAddress = aStart;
62 entry.NumberOfBytes = aNumBytes;
63 (*sPrefetchVirtualMemory)(GetCurrentProcess(), 1, &entry, 0);
64 return;
66 #endif