gecko-dev/xpcom/glue/MemUtils.cpp
Doug Thayer 5f3d1ecd2e Bug 1546498 - Split out MaybePrefetchMemory's check into two functions r=aklotz
Temporarily just sidestep the issue in bug 1546498 (crash with latest SDK
on startup in Windows 7) by just continuing to use the old method in
Windows 7. We saw no wins in telemetry for Windows 7 anyway, so we should
investigate why that is, and why we see a mysterious crash in the fallback
code, in a followup bug.

Differential Revision: https://phabricator.services.mozilla.com/D29239

--HG--
extra : moz-landing-system : lando
2019-05-01 02:08:28 +00:00

68 lines
1.9 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/MemUtils.h"
#if defined(XP_WIN)
# include <windows.h>
# include "mozilla/Maybe.h"
#else
# include <sys/mman.h>
#endif
#if defined(XP_WIN)
typedef BOOL(WINAPI* PrefetchVirtualMemoryFn)(HANDLE, ULONG_PTR, PVOID, ULONG);
static mozilla::Maybe<PrefetchVirtualMemoryFn> sPrefetchVirtualMemory;
void MaybeInitPrefetchVirtualMemory() {
if (sPrefetchVirtualMemory.isNothing()) {
sPrefetchVirtualMemory.emplace(
reinterpret_cast<PrefetchVirtualMemoryFn>(GetProcAddress(
GetModuleHandleW(L"kernel32.dll"), "PrefetchVirtualMemory")));
}
}
#endif
bool mozilla::CanPrefetchMemory() {
#if defined(XP_SOLARIS) || defined(XP_UNIX)
return true;
#elif defined(XP_WIN)
MaybeInitPrefetchVirtualMemory();
return *sPrefetchVirtualMemory;
#else
return false;
#endif
}
void mozilla::PrefetchMemory(uint8_t* aStart, size_t aNumBytes) {
if (aNumBytes == 0) {
return;
}
#if defined(XP_SOLARIS)
posix_madvise(aStart, aNumBytes, POSIX_MADV_WILLNEED);
#elif defined(XP_UNIX)
madvise(aStart, aNumBytes, MADV_WILLNEED);
#elif defined(XP_WIN)
MaybeInitPrefetchVirtualMemory();
if (*sPrefetchVirtualMemory) {
// Normally, we'd use WIN32_MEMORY_RANGE_ENTRY, but that requires
// a different _WIN32_WINNT value before including windows.h, but
// that causes complications with unified sources. It's a simple
// enough struct anyways.
struct {
PVOID VirtualAddress;
SIZE_T NumberOfBytes;
} entry;
entry.VirtualAddress = aStart;
entry.NumberOfBytes = aNumBytes;
(*sPrefetchVirtualMemory)(GetCurrentProcess(), 1, &entry, 0);
return;
}
#endif
}