Home | History | Annotate | Download | only in disk_cache
      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