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