// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/files/memory_mapped_file.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/sys_info.h" namespace base { const MemoryMappedFile::Region MemoryMappedFile::Region::kWholeFile( base::LINKER_INITIALIZED); MemoryMappedFile::Region::Region(base::LinkerInitialized) : offset(0), size(0) { } MemoryMappedFile::Region::Region(int64 offset, int64 size) : offset(offset), size(size) { DCHECK_GE(offset, 0); DCHECK_GT(size, 0); } bool MemoryMappedFile::Region::operator==( const MemoryMappedFile::Region& other) const { return other.offset == offset && other.size == size; } MemoryMappedFile::~MemoryMappedFile() { CloseHandles(); } bool MemoryMappedFile::Initialize(const FilePath& file_name) { if (IsValid()) return false; file_.Initialize(file_name, File::FLAG_OPEN | File::FLAG_READ); if (!file_.IsValid()) { DLOG(ERROR) << "Couldn't open " << file_name.AsUTF8Unsafe(); return false; } if (!MapFileRegionToMemory(Region::kWholeFile)) { CloseHandles(); return false; } return true; } bool MemoryMappedFile::Initialize(File file) { return Initialize(file.Pass(), Region::kWholeFile); } bool MemoryMappedFile::Initialize(File file, const Region& region) { if (IsValid()) return false; file_ = file.Pass(); if (!MapFileRegionToMemory(region)) { CloseHandles(); return false; } return true; } bool MemoryMappedFile::IsValid() const { return data_ != NULL; } // static void MemoryMappedFile::CalculateVMAlignedBoundaries(int64 start, int64 size, int64* aligned_start, int64* aligned_size, int32* offset) { // Sadly, on Windows, the mmap alignment is not just equal to the page size. const int64 mask = static_cast(SysInfo::VMAllocationGranularity()) - 1; DCHECK_LT(mask, std::numeric_limits::max()); *offset = start & mask; *aligned_start = start & ~mask; *aligned_size = (size + *offset + mask) & ~mask; } } // namespace base