OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_DISK_CACHE_MEM_ENTRY_IMPL_H__ | 5 #ifndef NET_DISK_CACHE_MEM_ENTRY_IMPL_H_ |
6 #define NET_DISK_CACHE_MEM_ENTRY_IMPL_H__ | 6 #define NET_DISK_CACHE_MEM_ENTRY_IMPL_H_ |
7 | 7 |
8 #include "net/disk_cache/disk_cache.h" | 8 #include "net/disk_cache/disk_cache.h" |
| 9 #include "testing/gtest/include/gtest/gtest_prod.h" |
9 | 10 |
10 namespace disk_cache { | 11 namespace disk_cache { |
11 | 12 |
12 class MemBackendImpl; | 13 class MemBackendImpl; |
13 | 14 |
14 // This class implements the Entry interface for the memory-only cache. An | 15 // This class implements the Entry interface for the memory-only cache. An |
15 // object of this class represents a single entry on the cache. | 16 // object of this class represents a single entry on the cache. We use two |
| 17 // types of entries, parent and child to support sparse caching. |
| 18 // A parent entry is non-sparse until a sparse method is invoked (i.e. |
| 19 // ReadSparseData, WriteSparseData, GetAvailableRange) when sparse information |
| 20 // is initialized. It then manages a list of child entries and delegates the |
| 21 // sparse API calls to the child entries. It creates and deletes child entries |
| 22 // and updates the list when needed. |
| 23 // A child entry is used to carry partial cache content, non-sparse methods like |
| 24 // ReadData and WriteData cannot be applied to them. The lifetime of a child |
| 25 // entry is managed by the parent entry that created it except that the entry |
| 26 // can be evicted independently. A child entry does not have a key and it is not |
| 27 // registered in the backend's entry map. It is registered in the backend's |
| 28 // ranking list to enable eviction of a partial content. |
16 class MemEntryImpl : public Entry { | 29 class MemEntryImpl : public Entry { |
17 public: | 30 public: |
| 31 enum EntryType { |
| 32 kParentEntry, |
| 33 kChildEntry, |
| 34 }; |
| 35 |
18 explicit MemEntryImpl(MemBackendImpl* backend); | 36 explicit MemEntryImpl(MemBackendImpl* backend); |
19 | 37 |
20 // Entry interface. | 38 // Entry interface. |
21 virtual void Doom(); | 39 virtual void Doom(); |
22 virtual void Close(); | 40 virtual void Close(); |
23 virtual std::string GetKey() const; | 41 virtual std::string GetKey() const; |
24 virtual base::Time GetLastUsed() const; | 42 virtual base::Time GetLastUsed() const; |
25 virtual base::Time GetLastModified() const; | 43 virtual base::Time GetLastModified() const; |
26 virtual int32 GetDataSize(int index) const; | 44 virtual int32 GetDataSize(int index) const; |
27 virtual int ReadData(int index, int offset, net::IOBuffer* buf, int buf_len, | 45 virtual int ReadData(int index, int offset, net::IOBuffer* buf, int buf_len, |
28 net::CompletionCallback* completion_callback); | 46 net::CompletionCallback* completion_callback); |
29 virtual int WriteData(int index, int offset, net::IOBuffer* buf, int buf_len, | 47 virtual int WriteData(int index, int offset, net::IOBuffer* buf, int buf_len, |
30 net::CompletionCallback* completion_callback, | 48 net::CompletionCallback* completion_callback, |
31 bool truncate); | 49 bool truncate); |
32 virtual int ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len, | 50 virtual int ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len, |
33 net::CompletionCallback* completion_callback); | 51 net::CompletionCallback* completion_callback); |
34 virtual int WriteSparseData(int64 offset, net::IOBuffer* buf, int buf_len, | 52 virtual int WriteSparseData(int64 offset, net::IOBuffer* buf, int buf_len, |
35 net::CompletionCallback* completion_callback); | 53 net::CompletionCallback* completion_callback); |
36 virtual int GetAvailableRange(int64 offset, int len, int64* start); | 54 virtual int GetAvailableRange(int64 offset, int len, int64* start); |
37 | 55 |
38 // Performs the initialization of a EntryImpl that will be added to the | 56 // Performs the initialization of a EntryImpl that will be added to the |
39 // cache. | 57 // cache. |
40 bool CreateEntry(const std::string& key); | 58 bool CreateEntry(const std::string& key); |
41 | 59 |
42 // Permamently destroys this entry | 60 // Performs the initialization of a MemEntryImpl as a child entry. |
| 61 // TODO(hclam): this method should be private. Leave this as public because |
| 62 // this is the only way to create a child entry. Move this method to private |
| 63 // once child entries are created by parent entry. |
| 64 bool CreateChildEntry(MemEntryImpl* parent); |
| 65 |
| 66 // Permanently destroys this entry. |
43 void InternalDoom(); | 67 void InternalDoom(); |
44 | 68 |
| 69 void Open(); |
| 70 bool InUse(); |
| 71 |
45 MemEntryImpl* next() const { | 72 MemEntryImpl* next() const { |
46 return next_; | 73 return next_; |
47 } | 74 } |
48 | 75 |
49 MemEntryImpl* prev() const { | 76 MemEntryImpl* prev() const { |
50 return prev_; | 77 return prev_; |
51 } | 78 } |
52 | 79 |
53 void set_next(MemEntryImpl* next) { | 80 void set_next(MemEntryImpl* next) { |
54 next_ = next; | 81 next_ = next; |
55 } | 82 } |
56 | 83 |
57 void set_prev(MemEntryImpl* prev) { | 84 void set_prev(MemEntryImpl* prev) { |
58 prev_ = prev; | 85 prev_ = prev; |
59 } | 86 } |
60 | 87 |
61 void Open(); | 88 EntryType type() const { |
62 bool InUse(); | 89 return type_; |
| 90 } |
63 | 91 |
64 private: | 92 private: |
65 enum { | 93 enum { |
66 NUM_STREAMS = 3 | 94 NUM_STREAMS = 3 |
67 }; | 95 }; |
68 | 96 |
69 ~MemEntryImpl(); | 97 ~MemEntryImpl(); |
70 | 98 |
71 // Grows and cleans up the data buffer. | 99 // Grows and cleans up the data buffer. |
72 void PrepareTarget(int index, int offset, int buf_len); | 100 void PrepareTarget(int index, int offset, int buf_len); |
73 | 101 |
74 // Updates ranking information. | 102 // Updates ranking information. |
75 void UpdateRank(bool modified); | 103 void UpdateRank(bool modified); |
76 | 104 |
77 std::string key_; | 105 std::string key_; |
78 std::vector<char> data_[NUM_STREAMS]; // User data. | 106 std::vector<char> data_[NUM_STREAMS]; // User data. |
79 int32 data_size_[NUM_STREAMS]; | 107 int32 data_size_[NUM_STREAMS]; |
80 int ref_count_; | 108 int ref_count_; |
81 | 109 |
82 MemEntryImpl* next_; // Pointers for the LRU list. | 110 MemEntryImpl* next_; // Pointers for the LRU list. |
83 MemEntryImpl* prev_; | 111 MemEntryImpl* prev_; |
84 base::Time last_modified_; // LRU information. | 112 MemEntryImpl* parent_; // Pointer to the parent entry. |
| 113 base::Time last_modified_; // LRU information. |
85 base::Time last_used_; | 114 base::Time last_used_; |
86 MemBackendImpl* backend_; // Back pointer to the cache. | 115 MemBackendImpl* backend_; // Back pointer to the cache. |
87 bool doomed_; // True if this entry was removed from the cache. | 116 bool doomed_; // True if this entry was removed from the cache. |
| 117 EntryType type_; // The type of this entry. |
88 | 118 |
89 DISALLOW_EVIL_CONSTRUCTORS(MemEntryImpl); | 119 DISALLOW_EVIL_CONSTRUCTORS(MemEntryImpl); |
90 }; | 120 }; |
91 | 121 |
92 } // namespace disk_cache | 122 } // namespace disk_cache |
93 | 123 |
94 #endif // NET_DISK_CACHE_MEM_ENTRY_IMPL_H__ | 124 #endif // NET_DISK_CACHE_MEM_ENTRY_IMPL_H_ |
OLD | NEW |