Commit 4ef932ea authored by Dorel Luca's avatar Dorel Luca
Browse files

Backed out changeset 1c79adcd8483 (bug 1546498) for build bustage. CLOSED TREE

--HG--
extra : rebase_source : aae1090ddfd8445a8cf03385dc200c65f4acd2e0
parent 76bdad23
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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) {
+5 −6
Original line number Diff line number Diff line
@@ -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));
@@ -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)
+15 −32
Original line number Diff line number Diff line
@@ -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
@@ -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
}
+1 −2
Original line number Diff line number Diff line
@@ -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