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 <stdlib.h>
      8 
      9 #include "base/files/file_path.h"
     10 #include "base/logging.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   if (!size)
     20     size = GetLength();
     21 
     22   buffer_ = malloc(size);
     23   snapshot_ = malloc(size);
     24   if (buffer_ && snapshot_ && Read(buffer_, size, 0)) {
     25     memcpy(snapshot_, buffer_, size);
     26   } else {
     27     free(buffer_);
     28     free(snapshot_);
     29     buffer_ = snapshot_ = 0;
     30   }
     31 
     32   init_ = true;
     33   view_size_ = size;
     34   return buffer_;
     35 }
     36 
     37 bool MappedFile::Load(const FileBlock* block) {
     38   size_t offset = block->offset() + view_size_;
     39   return Read(block->buffer(), block->size(), offset);
     40 }
     41 
     42 bool MappedFile::Store(const FileBlock* block) {
     43   size_t offset = block->offset() + view_size_;
     44   return Write(block->buffer(), block->size(), offset);
     45 }
     46 
     47 void MappedFile::Flush() {
     48   DCHECK(buffer_);
     49   DCHECK(snapshot_);
     50   const char* buffer_ptr = static_cast<const char*>(buffer_);
     51   char* snapshot_ptr = static_cast<char*>(snapshot_);
     52   const size_t block_size = 4096;
     53   for (size_t offset = 0; offset < view_size_; offset += block_size) {
     54     size_t size = std::min(view_size_ - offset, block_size);
     55     if (memcmp(snapshot_ptr + offset, buffer_ptr + offset, size)) {
     56       memcpy(snapshot_ptr + offset, buffer_ptr + offset, size);
     57       Write(snapshot_ptr + offset, size, offset);
     58     }
     59   }
     60 }
     61 
     62 MappedFile::~MappedFile() {
     63   if (!init_)
     64     return;
     65 
     66   if (buffer_ && snapshot_) {
     67     Flush();
     68   }
     69   free(buffer_);
     70   free(snapshot_);
     71 }
     72 
     73 }  // namespace disk_cache
     74