1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See net/disk_cache/disk_cache.h for the public interface.
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_DISK_CACHE_STORAGE_BLOCK_H__
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_DISK_CACHE_STORAGE_BLOCK_H__
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/addr.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mapped_file.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class encapsulates common behavior of a single "block" of data that is
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// stored on a block-file. It implements the FileBlock interface, so it can be
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// serialized directly to the backing file.
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This object provides a memory buffer for the related data, and it can be used
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to actually share that memory with another instance of the class.
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The following example shows how to share storage with another object:
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    StorageBlock<TypeA> a(file, address);
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    StorageBlock<TypeB> b(file, address);
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    a.Load();
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    DoSomething(a.Data());
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    b.SetData(a.Data());
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    ModifySomething(b.Data());
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    // Data modified on the previous call will be saved by b's destructor.
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//    b.set_modified();
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate<typename T>
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass StorageBlock : public FileBlock {
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StorageBlock(MappedFile* file, Addr address);
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~StorageBlock();
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // FileBlock interface.
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void* buffer() const;
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual size_t size() const;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int offset() const;
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Allows the overide of dummy values passed on the constructor.
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool LazyInit(MappedFile* file, Addr address);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Sets the internal storage to share the memory provided by other instance.
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void SetData(T* other);
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Deletes the data, even if it was modified and not saved. This object must
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // own the memory buffer (it cannot be shared).
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Discard();
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Stops sharing the data with another object.
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void StopSharingData();
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Sets the object to lazily save the in-memory data on destruction.
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void set_modified();
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets a pointer to the internal storage (allocates storage if needed).
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  T* Data();
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if there is data associated with this object.
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool HasData() const;
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if this object owns the data buffer, false if it is shared.
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool own_data() const;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const Addr address() const;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Loads and store the data.
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool Load();
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool Store();
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void AllocateData();
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void DeleteData();
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  T* data_;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MappedFile* file_;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Addr address_;
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool modified_;
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool own_data_;  // Is data_ owned by this object or shared with someone else.
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool extended_;  // Used to store an entry of more than one block.
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(StorageBlock);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef StorageBlock<EntryStore> CacheEntryBlock;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef StorageBlock<RankingsNode> CacheRankingsBlock;
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace disk_cache
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_DISK_CACHE_STORAGE_BLOCK_H__
93