Loading modules/libjar/nsZipArchive.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -651,7 +651,8 @@ nsresult nsZipArchive::BuildFileList(PRFileDesc *aFd) { xtolong(startp + centralOffset) == CENTRALSIG) { // Success means optimized jar layout from bug 559961 is in effect uint32_t readaheadLength = xtolong(startp); mozilla::PrefetchMemory(const_cast<uint8_t *>(startp), readaheadLength); mozilla::MaybePrefetchMemory(const_cast<uint8_t *>(startp), readaheadLength); } else { for (buf = endp - ZIPEND_SIZE; buf > startp; buf--) { if (xtolong(buf) == ENDSIG) { Loading xpcom/glue/FileUtils.cpp +5 −6 Original line number Diff line number Diff line Loading @@ -358,10 +358,6 @@ void mozilla::ReadAheadLib(mozilla::pathstr_t aFilePath) { return; } #if defined(XP_WIN) if (!CanPrefetchMemory()) { ReadAheadFile(aFilePath); return; } nsAutoHandle fd(CreateFileW(aFilePath, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr)); Loading @@ -386,8 +382,11 @@ void mozilla::ReadAheadLib(mozilla::pathstr_t aFilePath) { MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, (size_t)fileSize.QuadPart); auto guard = MakeScopeExit([=]() { UnmapViewOfFile(data); }); if (data) { PrefetchMemory((uint8_t*)data, (size_t)fileSize.QuadPart); if (data && !MaybePrefetchMemory((uint8_t*)data, (size_t)fileSize.QuadPart)) { volatile uint8_t read = 0; for (size_t i = 0; i < (size_t)fileSize.QuadPart; i += 4096) { read += ((uint8_t*)data)[i]; } } #elif defined(LINUX) && !defined(ANDROID) Loading xpcom/glue/MemUtils.cpp +15 −32 Original line number Diff line number Diff line Loading @@ -8,48 +8,28 @@ #if defined(XP_WIN) # include <windows.h> # include "mozilla/Maybe.h" #else # include <sys/mman.h> #endif #if defined(XP_WIN) typedef BOOL (*PrefetchVirtualMemoryFn)(HANDLE, ULONG_PTR, PVOID, ULONG); 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) { bool mozilla::MaybePrefetchMemory(uint8_t* aStart, size_t aNumBytes) { if (aNumBytes == 0) { return; return true; } #if defined(XP_SOLARIS) posix_madvise(aStart, aNumBytes, POSIX_MADV_WILLNEED); return true; #elif defined(XP_UNIX) madvise(aStart, aNumBytes, MADV_WILLNEED); return true; #elif defined(XP_WIN) MaybeInitPrefetchVirtualMemory(); if (*sPrefetchVirtualMemory) { static auto prefetchVirtualMemory = reinterpret_cast<BOOL(WINAPI*)(HANDLE, ULONG_PTR, PVOID, ULONG)>( GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "PrefetchVirtualMemory")); if (prefetchVirtualMemory) { // 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 Loading @@ -60,8 +40,11 @@ void mozilla::PrefetchMemory(uint8_t* aStart, size_t aNumBytes) { } entry; entry.VirtualAddress = aStart; entry.NumberOfBytes = aNumBytes; (*sPrefetchVirtualMemory)(GetCurrentProcess(), 1, &entry, 0); return; prefetchVirtualMemory(GetCurrentProcess(), 1, &entry, 0); return true; } return false; #else return false; #endif } xpcom/glue/MemUtils.h +1 −2 Original line number Diff line number Diff line Loading @@ -12,8 +12,7 @@ namespace mozilla { bool CanPrefetchMemory(); void PrefetchMemory(uint8_t* aStart, size_t aNumBytes); bool MaybePrefetchMemory(uint8_t* aStart, size_t aNumBytes); } // namespace mozilla Loading Loading
modules/libjar/nsZipArchive.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -651,7 +651,8 @@ nsresult nsZipArchive::BuildFileList(PRFileDesc *aFd) { xtolong(startp + centralOffset) == CENTRALSIG) { // Success means optimized jar layout from bug 559961 is in effect uint32_t readaheadLength = xtolong(startp); mozilla::PrefetchMemory(const_cast<uint8_t *>(startp), readaheadLength); mozilla::MaybePrefetchMemory(const_cast<uint8_t *>(startp), readaheadLength); } else { for (buf = endp - ZIPEND_SIZE; buf > startp; buf--) { if (xtolong(buf) == ENDSIG) { Loading
xpcom/glue/FileUtils.cpp +5 −6 Original line number Diff line number Diff line Loading @@ -358,10 +358,6 @@ void mozilla::ReadAheadLib(mozilla::pathstr_t aFilePath) { return; } #if defined(XP_WIN) if (!CanPrefetchMemory()) { ReadAheadFile(aFilePath); return; } nsAutoHandle fd(CreateFileW(aFilePath, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr)); Loading @@ -386,8 +382,11 @@ void mozilla::ReadAheadLib(mozilla::pathstr_t aFilePath) { MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, (size_t)fileSize.QuadPart); auto guard = MakeScopeExit([=]() { UnmapViewOfFile(data); }); if (data) { PrefetchMemory((uint8_t*)data, (size_t)fileSize.QuadPart); if (data && !MaybePrefetchMemory((uint8_t*)data, (size_t)fileSize.QuadPart)) { volatile uint8_t read = 0; for (size_t i = 0; i < (size_t)fileSize.QuadPart; i += 4096) { read += ((uint8_t*)data)[i]; } } #elif defined(LINUX) && !defined(ANDROID) Loading
xpcom/glue/MemUtils.cpp +15 −32 Original line number Diff line number Diff line Loading @@ -8,48 +8,28 @@ #if defined(XP_WIN) # include <windows.h> # include "mozilla/Maybe.h" #else # include <sys/mman.h> #endif #if defined(XP_WIN) typedef BOOL (*PrefetchVirtualMemoryFn)(HANDLE, ULONG_PTR, PVOID, ULONG); 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) { bool mozilla::MaybePrefetchMemory(uint8_t* aStart, size_t aNumBytes) { if (aNumBytes == 0) { return; return true; } #if defined(XP_SOLARIS) posix_madvise(aStart, aNumBytes, POSIX_MADV_WILLNEED); return true; #elif defined(XP_UNIX) madvise(aStart, aNumBytes, MADV_WILLNEED); return true; #elif defined(XP_WIN) MaybeInitPrefetchVirtualMemory(); if (*sPrefetchVirtualMemory) { static auto prefetchVirtualMemory = reinterpret_cast<BOOL(WINAPI*)(HANDLE, ULONG_PTR, PVOID, ULONG)>( GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "PrefetchVirtualMemory")); if (prefetchVirtualMemory) { // 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 Loading @@ -60,8 +40,11 @@ void mozilla::PrefetchMemory(uint8_t* aStart, size_t aNumBytes) { } entry; entry.VirtualAddress = aStart; entry.NumberOfBytes = aNumBytes; (*sPrefetchVirtualMemory)(GetCurrentProcess(), 1, &entry, 0); return; prefetchVirtualMemory(GetCurrentProcess(), 1, &entry, 0); return true; } return false; #else return false; #endif }
xpcom/glue/MemUtils.h +1 −2 Original line number Diff line number Diff line Loading @@ -12,8 +12,7 @@ namespace mozilla { bool CanPrefetchMemory(); void PrefetchMemory(uint8_t* aStart, size_t aNumBytes); bool MaybePrefetchMemory(uint8_t* aStart, size_t aNumBytes); } // namespace mozilla Loading