| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013 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 #ifndef NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ | |
| 6 #define NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ | |
| 7 | |
| 8 #include <list> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "base/basictypes.h" | |
| 12 #include "base/callback.h" | |
| 13 #include "base/containers/hash_tables.h" | |
| 14 #include "base/files/file_path.h" | |
| 15 #include "base/gtest_prod_util.h" | |
| 16 #include "base/memory/ref_counted.h" | |
| 17 #include "base/memory/scoped_ptr.h" | |
| 18 #include "base/memory/weak_ptr.h" | |
| 19 #include "base/single_thread_task_runner.h" | |
| 20 #include "base/threading/thread_checker.h" | |
| 21 #include "base/time/time.h" | |
| 22 #include "base/timer/timer.h" | |
| 23 #include "net/base/cache_type.h" | |
| 24 #include "net/base/completion_callback.h" | |
| 25 #include "net/base/net_export.h" | |
| 26 | |
| 27 #if defined(OS_ANDROID) | |
| 28 #include "base/android/application_status_listener.h" | |
| 29 #endif | |
| 30 | |
| 31 class Pickle; | |
| 32 class PickleIterator; | |
| 33 | |
| 34 namespace disk_cache { | |
| 35 | |
| 36 class SimpleIndexDelegate; | |
| 37 class SimpleIndexFile; | |
| 38 struct SimpleIndexLoadResult; | |
| 39 | |
| 40 class NET_EXPORT_PRIVATE EntryMetadata { | |
| 41 public: | |
| 42 EntryMetadata(); | |
| 43 EntryMetadata(base::Time last_used_time, uint64 entry_size); | |
| 44 | |
| 45 base::Time GetLastUsedTime() const; | |
| 46 void SetLastUsedTime(const base::Time& last_used_time); | |
| 47 | |
| 48 uint64 GetEntrySize() const; | |
| 49 void SetEntrySize(uint64 entry_size); | |
| 50 | |
| 51 // Serialize the data into the provided pickle. | |
| 52 void Serialize(Pickle* pickle) const; | |
| 53 bool Deserialize(PickleIterator* it); | |
| 54 | |
| 55 static base::TimeDelta GetLowerEpsilonForTimeComparisons() { | |
| 56 return base::TimeDelta::FromSeconds(1); | |
| 57 } | |
| 58 static base::TimeDelta GetUpperEpsilonForTimeComparisons() { | |
| 59 return base::TimeDelta(); | |
| 60 } | |
| 61 | |
| 62 private: | |
| 63 friend class SimpleIndexFileTest; | |
| 64 | |
| 65 // There are tens of thousands of instances of EntryMetadata in memory, so the | |
| 66 // size of each entry matters. Even when the values used to set these members | |
| 67 // are originally calculated as >32-bit types, the actual necessary size for | |
| 68 // each shouldn't exceed 32 bits, so we use 32-bit types here. | |
| 69 uint32 last_used_time_seconds_since_epoch_; | |
| 70 int32 entry_size_; // Storage size in bytes. | |
| 71 }; | |
| 72 static_assert(sizeof(EntryMetadata) == 8, "incorrect metadata size"); | |
| 73 | |
| 74 // This class is not Thread-safe. | |
| 75 class NET_EXPORT_PRIVATE SimpleIndex | |
| 76 : public base::SupportsWeakPtr<SimpleIndex> { | |
| 77 public: | |
| 78 typedef std::vector<uint64> HashList; | |
| 79 | |
| 80 SimpleIndex(const scoped_refptr<base::SingleThreadTaskRunner>& io_thread, | |
| 81 SimpleIndexDelegate* delegate, | |
| 82 net::CacheType cache_type, | |
| 83 scoped_ptr<SimpleIndexFile> simple_index_file); | |
| 84 | |
| 85 virtual ~SimpleIndex(); | |
| 86 | |
| 87 void Initialize(base::Time cache_mtime); | |
| 88 | |
| 89 void SetMaxSize(uint64 max_bytes); | |
| 90 uint64 max_size() const { return max_size_; } | |
| 91 | |
| 92 void Insert(uint64 entry_hash); | |
| 93 void Remove(uint64 entry_hash); | |
| 94 | |
| 95 // Check whether the index has the entry given the hash of its key. | |
| 96 bool Has(uint64 entry_hash) const; | |
| 97 | |
| 98 // Update the last used time of the entry with the given key and return true | |
| 99 // iff the entry exist in the index. | |
| 100 bool UseIfExists(uint64 entry_hash); | |
| 101 | |
| 102 void WriteToDisk(); | |
| 103 | |
| 104 // Update the size (in bytes) of an entry, in the metadata stored in the | |
| 105 // index. This should be the total disk-file size including all streams of the | |
| 106 // entry. | |
| 107 bool UpdateEntrySize(uint64 entry_hash, int64 entry_size); | |
| 108 | |
| 109 typedef base::hash_map<uint64, EntryMetadata> EntrySet; | |
| 110 | |
| 111 static void InsertInEntrySet(uint64 entry_hash, | |
| 112 const EntryMetadata& entry_metadata, | |
| 113 EntrySet* entry_set); | |
| 114 | |
| 115 // Executes the |callback| when the index is ready. Allows multiple callbacks. | |
| 116 int ExecuteWhenReady(const net::CompletionCallback& callback); | |
| 117 | |
| 118 // Returns entries from the index that have last accessed time matching the | |
| 119 // range between |initial_time| and |end_time| where open intervals are | |
| 120 // possible according to the definition given in |DoomEntriesBetween()| in the | |
| 121 // disk cache backend interface. | |
| 122 scoped_ptr<HashList> GetEntriesBetween(const base::Time initial_time, | |
| 123 const base::Time end_time); | |
| 124 | |
| 125 // Returns the list of all entries key hash. | |
| 126 scoped_ptr<HashList> GetAllHashes(); | |
| 127 | |
| 128 // Returns number of indexed entries. | |
| 129 int32 GetEntryCount() const; | |
| 130 | |
| 131 // Returns whether the index has been initialized yet. | |
| 132 bool initialized() const { return initialized_; } | |
| 133 | |
| 134 private: | |
| 135 friend class SimpleIndexTest; | |
| 136 FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, IndexSizeCorrectOnMerge); | |
| 137 FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWriteQueued); | |
| 138 FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWriteExecuted); | |
| 139 FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWritePostponed); | |
| 140 | |
| 141 void StartEvictionIfNeeded(); | |
| 142 void EvictionDone(int result); | |
| 143 | |
| 144 void PostponeWritingToDisk(); | |
| 145 | |
| 146 void UpdateEntryIteratorSize(EntrySet::iterator* it, int64 entry_size); | |
| 147 | |
| 148 // Must run on IO Thread. | |
| 149 void MergeInitializingSet(scoped_ptr<SimpleIndexLoadResult> load_result); | |
| 150 | |
| 151 #if defined(OS_ANDROID) | |
| 152 void OnApplicationStateChange(base::android::ApplicationState state); | |
| 153 | |
| 154 scoped_ptr<base::android::ApplicationStatusListener> app_status_listener_; | |
| 155 #endif | |
| 156 | |
| 157 // The owner of |this| must ensure the |delegate_| outlives |this|. | |
| 158 SimpleIndexDelegate* delegate_; | |
| 159 | |
| 160 EntrySet entries_set_; | |
| 161 | |
| 162 const net::CacheType cache_type_; | |
| 163 uint64 cache_size_; // Total cache storage size in bytes. | |
| 164 uint64 max_size_; | |
| 165 uint64 high_watermark_; | |
| 166 uint64 low_watermark_; | |
| 167 bool eviction_in_progress_; | |
| 168 base::TimeTicks eviction_start_time_; | |
| 169 | |
| 170 // This stores all the entry_hash of entries that are removed during | |
| 171 // initialization. | |
| 172 base::hash_set<uint64> removed_entries_; | |
| 173 bool initialized_; | |
| 174 | |
| 175 scoped_ptr<SimpleIndexFile> index_file_; | |
| 176 | |
| 177 scoped_refptr<base::SingleThreadTaskRunner> io_thread_; | |
| 178 | |
| 179 // All nonstatic SimpleEntryImpl methods should always be called on the IO | |
| 180 // thread, in all cases. |io_thread_checker_| documents and enforces this. | |
| 181 base::ThreadChecker io_thread_checker_; | |
| 182 | |
| 183 // Timestamp of the last time we wrote the index to disk. | |
| 184 // PostponeWritingToDisk() may give up postponing and allow the write if it | |
| 185 // has been a while since last time we wrote. | |
| 186 base::TimeTicks last_write_to_disk_; | |
| 187 | |
| 188 base::OneShotTimer<SimpleIndex> write_to_disk_timer_; | |
| 189 base::Closure write_to_disk_cb_; | |
| 190 | |
| 191 typedef std::list<net::CompletionCallback> CallbackList; | |
| 192 CallbackList to_run_when_initialized_; | |
| 193 | |
| 194 // Set to true when the app is on the background. When the app is in the | |
| 195 // background we can write the index much more frequently, to insure fresh | |
| 196 // index on next startup. | |
| 197 bool app_on_background_; | |
| 198 }; | |
| 199 | |
| 200 } // namespace disk_cache | |
| 201 | |
| 202 #endif // NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ | |
| OLD | NEW |