simple_index.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <list> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/gtest_prod_util.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/hash_tables.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_checker.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/time.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/timer.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/completion_callback.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/net_export.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/android/activity_status.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Pickle; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PickleIterator; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base { 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SingleThreadTaskRunner; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace disk_cache { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE EntryMetadata { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntryMetadata(); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntryMetadata(uint64 hash_key, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time last_used_time, 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 entry_size); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 GetHashKey() const { return hash_key_; } 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time GetLastUsedTime() const; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLastUsedTime(const base::Time& last_used_time); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 GetEntrySize() const { return entry_size_; } 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetEntrySize(uint64 entry_size) { entry_size_ = entry_size; } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Serialize the data into the provided pickle. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Serialize(Pickle* pickle) const; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Deserialize(PickleIterator* it); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Merge two EntryMetadata instances. 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The existing current valid data in |this| will prevail. 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void MergeWith(const EntryMetadata& entry_metadata); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class SimpleIndexFileTest; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When adding new members here, you should update the Serialize() and 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deserialize() methods. 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 hash_key_; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is the serialized format from Time::ToInternalValue(). 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If you want to make calculations/comparisons, you should use the 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // base::Time() class. Use the GetLastUsedTime() method above. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(felipeg): Use Time() here. 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 last_used_time_; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 entry_size_; // Storage size in bytes. 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class is not Thread-safe. 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE SimpleIndex 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public base::SupportsWeakPtr<SimpleIndex> { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SimpleIndex(base::SingleThreadTaskRunner* cache_thread, 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::SingleThreadTaskRunner* io_thread, 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& path); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SimpleIndex(); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Initialize(); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetMaxSize(int max_bytes); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Insert(const std::string& key); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Remove(const std::string& key); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Has(const std::string& key) const; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update the last used time of the entry with the given key and return true 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // iff the entry exist in the index. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool UseIfExists(const std::string& key); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WriteToDisk(); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update the size (in bytes) of an entry, in the metadata stored in the 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // index. This should be the total disk-file size including all streams of the 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // entry. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool UpdateEntrySize(const std::string& key, uint64 entry_size); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(felipeg): This way we are storing the hash_key twice, as the 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // hash_map::key and as a member of EntryMetadata. We could save space if we 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // use a hash_set. 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::hash_map<uint64, EntryMetadata> EntrySet; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void InsertInEntrySet(const EntryMetadata& entry_metadata, 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntrySet* entry_set); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Executes the |callback| when the index is ready. Allows multiple callbacks. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int ExecuteWhenReady(const net::CompletionCallback& callback); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Takes out entries from the index that have last accessed time matching the 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // range between |initial_time| and |end_time| where open intervals are 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible according to the definition given in |DoomEntriesBetween()| in the 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // disk cache backend interface. Returns the set of hashes taken out. 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<std::vector<uint64> > RemoveEntriesBetween( 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Time initial_time, 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Time end_time); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns number of indexed entries. 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int32 GetEntryCount() const; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, IsIndexFileStale); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, IndexSizeCorrectOnMerge); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(scoped_ptr<EntrySet>, bool force_index_flush)> 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IndexCompletionCallback; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StartEvictionIfNeeded(); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void EvictionDone(scoped_ptr<int> result); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PostponeWritingToDisk(); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Using the mtime of the file and its mtime, detects if the index file is 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // stale. 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool IsIndexFileStale(const base::FilePath& index_filename); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void InitializeInternal( 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& index_filename, 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::SingleThreadTaskRunner* io_thread, 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IndexCompletionCallback& completion_callback); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Enumerates all entries' files on disk and regenerates the index. 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_ptr<SimpleIndex::EntrySet> RestoreFromDisk( 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& index_filename); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void WriteToDiskInternal(const base::FilePath& index_filename, 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Pickle> pickle, 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::TimeTicks& start_time); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Must run on IO Thread. 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void MergeInitializingSet(scoped_ptr<EntrySet> index_file_entries, 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool force_index_flush); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnActivityStateChange(base::android::ActivityState state); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::android::ActivityStatus::Listener> activity_status_listener_; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntrySet entries_set_; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 cache_size_; // Total cache storage size in bytes. 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 max_size_; 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 high_watermark_; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 low_watermark_; 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool eviction_in_progress_; 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks eviction_start_time_; 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This stores all the hash_key of entries that are removed during 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initialization. 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::hash_set<uint64> removed_entries_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool initialized_; 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath index_filename_; 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> cache_thread_; 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> io_thread_; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All nonstatic SimpleEntryImpl methods should always be called on the IO 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // thread, in all cases. |io_thread_checker_| documents and enforces this. 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ThreadChecker io_thread_checker_; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Timestamp of the last time we wrote the index to disk. 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // PostponeWritingToDisk() may give up postponing and allow the write if it 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // has been a while since last time we wrote. 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time last_write_to_disk_; 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::OneShotTimer<SimpleIndex> write_to_disk_timer_; 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::list<net::CompletionCallback> CallbackList; 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CallbackList to_run_when_initialized_; 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set to true when the app is on the background. When the app is in the 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // background we can write the index much more frequently, to insure fresh 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // index on next startup. 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool app_on_background_; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace disk_cache 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ 208