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 <vector>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/gtest_prod_util.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/single_thread_task_runner.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_checker.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/base/cache_type.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)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/android/application_status_listener.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)
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class SimpleIndexDelegate;
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SimpleIndexFile;
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstruct SimpleIndexLoadResult;
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE EntryMetadata {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EntryMetadata();
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EntryMetadata(base::Time last_used_time, int entry_size);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time GetLastUsedTime() const;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetLastUsedTime(const base::Time& last_used_time);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int GetEntrySize() const { return entry_size_; }
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void SetEntrySize(int entry_size) { entry_size_ = entry_size; }
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Serialize the data into the provided pickle.
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Serialize(Pickle* pickle) const;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool Deserialize(PickleIterator* it);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  static base::TimeDelta GetLowerEpsilonForTimeComparisons() {
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return base::TimeDelta::FromSeconds(1);
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  static base::TimeDelta GetUpperEpsilonForTimeComparisons() {
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return base::TimeDelta();
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class SimpleIndexFileTest;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When adding new members here, you should update the Serialize() and
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Deserialize() methods.
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  uint32 last_used_time_seconds_since_epoch_;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int32 entry_size_;  // Storage size in bytes.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)COMPILE_ASSERT(sizeof(EntryMetadata) == 8, metadata_size);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class is not Thread-safe.
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE SimpleIndex
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public base::SupportsWeakPtr<SimpleIndex> {
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::vector<uint64> HashList;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimpleIndex(const scoped_refptr<base::SingleThreadTaskRunner>& io_thread,
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              SimpleIndexDelegate* delegate,
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              net::CacheType cache_type,
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              scoped_ptr<SimpleIndexFile> simple_index_file);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SimpleIndex();
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  void Initialize(base::Time cache_mtime);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool SetMaxSize(int max_bytes);
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int max_size() const { return max_size_; }
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void Insert(uint64 entry_hash);
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void Remove(uint64 entry_hash);
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check whether the index has the entry given the hash of its key.
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool Has(uint64 entry_hash) const;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Update the last used time of the entry with the given key and return true
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // iff the entry exist in the index.
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool UseIfExists(uint64 entry_hash);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void WriteToDisk();
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Update the size (in bytes) of an entry, in the metadata stored in the
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // index. This should be the total disk-file size including all streams of the
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // entry.
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool UpdateEntrySize(uint64 entry_hash, int entry_size);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef base::hash_map<uint64, EntryMetadata> EntrySet;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static void InsertInEntrySet(uint64 entry_hash,
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               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)
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns 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
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // disk cache backend interface.
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<HashList> GetEntriesBetween(const base::Time initial_time,
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                         const base::Time end_time);
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the list of all entries key hash.
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<HashList> GetAllHashes();
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns number of indexed entries.
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int32 GetEntryCount() const;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns whether the index has been initialized yet.
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool initialized() const { return initialized_; }
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class SimpleIndexTest;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, IndexSizeCorrectOnMerge);
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWriteQueued);
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWriteExecuted);
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SimpleIndexTest, DiskWritePostponed);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void StartEvictionIfNeeded();
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void EvictionDone(int result);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void PostponeWritingToDisk();
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void UpdateEntryIteratorSize(EntrySet::iterator* it, int entry_size);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Must run on IO Thread.
149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void MergeInitializingSet(scoped_ptr<SimpleIndexLoadResult> load_result);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnApplicationStateChange(base::android::ApplicationState state);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::android::ApplicationStatusListener> app_status_listener_;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The owner of |this| must ensure the |delegate_| outlives |this|.
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SimpleIndexDelegate* delegate_;
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EntrySet entries_set_;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const net::CacheType cache_type_;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint64 cache_size_;  // Total cache storage size in bytes.
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint64 max_size_;
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint64 high_watermark_;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint64 low_watermark_;
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool eviction_in_progress_;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks eviction_start_time_;
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This stores all the entry_hash of entries that are removed during
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // initialization.
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::hash_set<uint64> removed_entries_;
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool initialized_;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SimpleIndexFile> index_file_;
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> io_thread_;
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // All nonstatic SimpleEntryImpl methods should always be called on the IO
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // thread, in all cases. |io_thread_checker_| documents and enforces this.
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ThreadChecker io_thread_checker_;
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Timestamp of the last time we wrote the index to disk.
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // PostponeWritingToDisk() may give up postponing and allow the write if it
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // has been a while since last time we wrote.
186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::TimeTicks last_write_to_disk_;
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::OneShotTimer<SimpleIndex> write_to_disk_timer_;
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Closure write_to_disk_cb_;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::list<net::CompletionCallback> CallbackList;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallbackList to_run_when_initialized_;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set to true when the app is on the background. When the app is in the
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // background we can write the index much more frequently, to insure fresh
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // index on next startup.
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool app_on_background_;
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace disk_cache
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // NET_DISK_CACHE_SIMPLE_SIMPLE_INDEX_H_
203