simple_index.h revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/gtest_prod_util.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" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/single_thread_task_runner.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_checker.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/time.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/timer.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/completion_callback.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/net_export.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/android/activity_status.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Pickle; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PickleIterator; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace disk_cache { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SimpleIndexFile; 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE EntryMetadata { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntryMetadata(); 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EntryMetadata(base::Time last_used_time, uint64 entry_size); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time GetLastUsedTime() const; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLastUsedTime(const base::Time& last_used_time); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 GetEntrySize() const { return entry_size_; } 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetEntrySize(uint64 entry_size) { entry_size_ = entry_size; } 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Serialize the data into the provided pickle. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Serialize(Pickle* pickle) const; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Deserialize(PickleIterator* it); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class SimpleIndexFileTest; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When adding new members here, you should update the Serialize() and 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deserialize() methods. 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is the serialized format from Time::ToInternalValue(). 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If you want to make calculations/comparisons, you should use the 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // base::Time() class. Use the GetLastUsedTime() method above. 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(felipeg): Use Time() here. 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 last_used_time_; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 entry_size_; // Storage size in bytes. 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class is not Thread-safe. 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE SimpleIndex 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public base::SupportsWeakPtr<SimpleIndex> { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SimpleIndex(base::SingleThreadTaskRunner* io_thread, 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& cache_directory, 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<SimpleIndexFile> simple_index_file); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SimpleIndex(); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Initialize(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetMaxSize(int max_bytes); 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int max_size() const { return max_size_; } 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Insert(const std::string& key); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Remove(const std::string& key); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool Has(const std::string& key) const; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update the last used time of the entry with the given key and return true 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // iff the entry exist in the index. 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool UseIfExists(const std::string& key); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WriteToDisk(); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update the size (in bytes) of an entry, in the metadata stored in the 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // index. This should be the total disk-file size including all streams of the 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // entry. 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool UpdateEntrySize(const std::string& key, uint64 entry_size); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(felipeg): This way we are storing the hash_key twice, as the 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // hash_map::key and as a member of EntryMetadata. We could save space if we 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // use a hash_set. 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::hash_map<uint64, EntryMetadata> EntrySet; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void InsertInEntrySet(uint64 hash_key, 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const EntryMetadata& entry_metadata, 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntrySet* entry_set); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Executes the |callback| when the index is ready. Allows multiple callbacks. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int ExecuteWhenReady(const net::CompletionCallback& callback); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Takes out entries from the index that have last accessed time matching the 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // range between |initial_time| and |end_time| where open intervals are 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible according to the definition given in |DoomEntriesBetween()| in the 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // disk cache backend interface. Returns the set of hashes taken out. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<std::vector<uint64> > RemoveEntriesBetween( 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Time initial_time, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Time end_time); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns number of indexed entries. 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int32 GetEntryCount() const; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) friend class SimpleIndexTest; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, IndexSizeCorrectOnMerge); 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWriteQueued); 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWriteExecuted); 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWritePostponed); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StartEvictionIfNeeded(); 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void EvictionDone(int result); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void PostponeWritingToDisk(); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void UpdateEntryIteratorSize(EntrySet::iterator* it, uint64 entry_size); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Must run on IO Thread. 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void MergeInitializingSet(scoped_ptr<EntrySet> index_file_entries, 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool force_index_flush); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnActivityStateChange(base::android::ActivityState state); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::android::ActivityStatus::Listener> activity_status_listener_; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EntrySet entries_set_; 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 cache_size_; // Total cache storage size in bytes. 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 max_size_; 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 high_watermark_; 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 low_watermark_; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool eviction_in_progress_; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks eviction_start_time_; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This stores all the hash_key of entries that are removed during 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initialization. 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::hash_set<uint64> removed_entries_; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool initialized_; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& cache_directory_; 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<SimpleIndexFile> index_file_; 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> io_thread_; 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // All nonstatic SimpleEntryImpl methods should always be called on the IO 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // thread, in all cases. |io_thread_checker_| documents and enforces this. 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ThreadChecker io_thread_checker_; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Timestamp of the last time we wrote the index to disk. 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // PostponeWritingToDisk() may give up postponing and allow the write if it 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // has been a while since last time we wrote. 172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::TimeTicks last_write_to_disk_; 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::OneShotTimer<SimpleIndex> write_to_disk_timer_; 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Closure write_to_disk_cb_; 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::list<net::CompletionCallback> CallbackList; 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CallbackList to_run_when_initialized_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set to true when the app is on the background. When the app is in the 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // background we can write the index much more frequently, to insure fresh 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // index on next startup. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool app_on_background_; 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The time in milliseconds for the index to be idle before it gets flushed to 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the disk. When the app is on foreground the delay is different from the 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // background state. 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int foreground_flush_delay_; 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int background_flush_delay_; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace disk_cache 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_ 195