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