1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/disk_cache/mapped_file.h" 6 7 #include "base/files/file_path.h" 8 #include "base/logging.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "net/disk_cache/disk_cache.h" 11 12 namespace disk_cache { 13 14 void* MappedFile::Init(const base::FilePath& name, size_t size) { 15 DCHECK(!init_); 16 if (init_ || !File::Init(name)) 17 return NULL; 18 19 buffer_ = NULL; 20 init_ = true; 21 section_ = CreateFileMapping(platform_file(), NULL, PAGE_READWRITE, 0, 22 static_cast<DWORD>(size), NULL); 23 if (!section_) 24 return NULL; 25 26 buffer_ = MapViewOfFile(section_, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size); 27 DCHECK(buffer_); 28 view_size_ = size; 29 30 // Make sure we detect hardware failures reading the headers. 31 size_t temp_len = size ? size : 4096; 32 scoped_ptr<char[]> temp(new char[temp_len]); 33 if (!Read(temp.get(), temp_len, 0)) 34 return NULL; 35 36 return buffer_; 37 } 38 39 MappedFile::~MappedFile() { 40 if (!init_) 41 return; 42 43 if (buffer_) { 44 BOOL ret = UnmapViewOfFile(buffer_); 45 DCHECK(ret); 46 } 47 48 if (section_) 49 CloseHandle(section_); 50 } 51 52 bool MappedFile::Load(const FileBlock* block) { 53 size_t offset = block->offset() + view_size_; 54 return Read(block->buffer(), block->size(), offset); 55 } 56 57 bool MappedFile::Store(const FileBlock* block) { 58 size_t offset = block->offset() + view_size_; 59 return Write(block->buffer(), block->size(), offset); 60 } 61 62 void MappedFile::Flush() { 63 } 64 65 } // namespace disk_cache 66