15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See net/disk_cache/disk_cache.h for the public interface of the cache. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NET_DISK_CACHE_BLOCKFILE_MAPPED_FILE_H_ 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define NET_DISK_CACHE_BLOCKFILE_MAPPED_FILE_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/file.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/file_block.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disk_cache { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements a memory mapped file used to access block-files. The 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// idea is that the header and bitmap will be memory mapped all the time, and 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the actual data for the blocks will be access asynchronously (most of the 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// time). 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE MappedFile : public File { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MappedFile() : File(true), init_(false) {} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Performs object initialization. name is the file to use, and size is the 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // amount of data to memory map from the file. If size is 0, the whole file 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be mapped in memory. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* Init(const base::FilePath& name, size_t size); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* buffer() const { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads or stores a given block from the backing file (synchronously). 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Load(const FileBlock* block); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Store(const FileBlock* block); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Asynchronous versions of Load/Store, following the semantics of File::Read 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and File::Write. 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool Load(const FileBlock* block, FileIOCallback* callback, bool* completed); 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool Store(const FileBlock* block, FileIOCallback* callback, bool* completed); 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flush the memory-mapped section to disk (synchronously). 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Flush(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Heats up the file system cache and make sure the file is fully 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // readable (synchronously). 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool Preload(); 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MappedFile(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool init_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE section_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* buffer_; // Address of the memory mapped buffer. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t view_size_; // Size of the memory pointed by buffer_. 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(POSIX_AVOID_MMAP) 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void* snapshot_; // Copy of the buffer taken when it was last flushed. 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MappedFile); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class for calling Flush() on exit from the current scope. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedFlush { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedFlush(MappedFile* file) : file_(file) {} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedFlush() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_->Flush(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MappedFile* file_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace disk_cache 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // NET_DISK_CACHE_BLOCKFILE_MAPPED_FILE_H_ 83