Home | History | Annotate | Download | only in blockfile
      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/blockfile/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 void MappedFile::Flush() {
     38   DCHECK(buffer_);
     39   DCHECK(snapshot_);
     40   const char* buffer_ptr = static_cast<const char*>(buffer_);
     41   char* snapshot_ptr = static_cast<char*>(snapshot_);
     42   const size_t block_size = 4096;
     43   for (size_t offset = 0; offset < view_size_; offset += block_size) {
     44     size_t size = std::min(view_size_ - offset, block_size);
     45     if (memcmp(snapshot_ptr + offset, buffer_ptr + offset, size)) {
     46       memcpy(snapshot_ptr + offset, buffer_ptr + offset, size);
     47       Write(snapshot_ptr + offset, size, offset);
     48     }
     49   }
     50 }
     51 
     52 MappedFile::~MappedFile() {
     53   if (!init_)
     54     return;
     55 
     56   if (buffer_ && snapshot_) {
     57     Flush();
     58   }
     59   free(buffer_);
     60   free(snapshot_);
     61 }
     62 
     63 }  // namespace disk_cache
     64