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