Chromium Code Reviews| Index: net/disk_cache/simple/simple_index.cc |
| diff --git a/net/disk_cache/simple/simple_index.cc b/net/disk_cache/simple/simple_index.cc |
| index 02c1453ad4742684562194c157fbd98667a917b1..f6c477c58e7b9e7046166c3825d603c37c69e797 100644 |
| --- a/net/disk_cache/simple/simple_index.cc |
| +++ b/net/disk_cache/simple/simple_index.cc |
| @@ -19,14 +19,13 @@ |
| #include "net/disk_cache/simple/simple_index_file.h" |
| #include "net/disk_cache/simple/simple_util.h" |
| + |
|
Philippe
2013/04/22 11:35:48
Nit: change not needed.
felipeg
2013/04/22 16:14:32
Done.
|
| namespace { |
| // How many seconds we delay writing the index to disk since the last cache |
| // operation has happened. |
| -const int kWriteToDiskDelaySecs = 20; |
| - |
| -// WriteToDisk at lest every 5 minutes. |
| -const int kMaxWriteToDiskDelaySecs = 300; |
| +const int kWriteToDiskDelay_ms = 20000; |
|
Philippe
2013/04/22 11:35:48
Nit: s/_ms/MSecs here and below.
felipeg
2013/04/22 16:14:32
Done.
|
| +const int kWriteToDiskOnBackgroundDelay_ms = 100; |
| } // namespace |
| @@ -86,7 +85,13 @@ SimpleIndex::SimpleIndex( |
| initialized_(false), |
| index_filename_(path.AppendASCII("simple-index")), |
| cache_thread_(cache_thread), |
| - io_thread_(io_thread) { |
| + io_thread_(io_thread), |
| +#if defined(OS_ANDROID) |
| + activity_status_notifier_( |
| + io_thread, |
| + base::Bind(&SimpleIndex::ActivityStatusChanged, AsWeakPtr())), |
| +#endif |
| + app_on_background_(false) { |
| } |
| SimpleIndex::~SimpleIndex() { |
| @@ -214,19 +219,19 @@ void SimpleIndex::InsertInEntrySet( |
| } |
| void SimpleIndex::PostponeWritingToDisk() { |
| - const base::TimeDelta file_age = base::Time::Now() - last_write_to_disk_; |
| - if (file_age > base::TimeDelta::FromSeconds(kMaxWriteToDiskDelaySecs) && |
| - write_to_disk_timer_.IsRunning()) { |
| - // If the index file is too old and there is a timer programmed to run a |
| - // WriteToDisk soon, we don't postpone it, so we always WriteToDisk |
| - // approximately every kMaxWriteToDiskDelaySecs. |
| + if (!initialized_) |
| return; |
| + int delay = kWriteToDiskDelay_ms; |
| + if (app_on_background_) { |
| + // When the app is in the background we can write the index much more |
| + // frequently. We could even write it to disk on every operation if we |
| + // wanted to. |
| + delay = kWriteToDiskOnBackgroundDelay_ms; |
| } |
| - |
| // If the timer is already active, Start() will just Reset it, postponing it. |
| write_to_disk_timer_.Start( |
| FROM_HERE, |
| - base::TimeDelta::FromSeconds(kWriteToDiskDelaySecs), |
| + base::TimeDelta::FromMilliseconds(delay), |
| base::Bind(&SimpleIndex::WriteToDisk, AsWeakPtr())); |
| } |
| @@ -257,8 +262,6 @@ scoped_ptr<SimpleIndex::EntrySet> SimpleIndex::RestoreFromDisk( |
| const base::FilePath& index_filename) { |
| using file_util::FileEnumerator; |
| LOG(INFO) << "Simple Cache Index is being restored from disk."; |
| - |
| - file_util::Delete(index_filename, /* recursive = */ false); |
| scoped_ptr<EntrySet> index_file_entries(new EntrySet()); |
| // TODO(felipeg,gavinp): Fix this once we have a one-file per entry format. |
| @@ -284,7 +287,6 @@ scoped_ptr<SimpleIndex::EntrySet> SimpleIndex::RestoreFromDisk( |
| hash_key_string, &hash_key)) { |
| LOG(WARNING) << "Invalid Entry Hash Key filename while restoring " |
| << "Simple Index from disk: " << hash_name; |
| - // TODO(felipeg): Should we delete the invalid file here ? |
| continue; |
| } |
| @@ -346,7 +348,6 @@ void SimpleIndex::MergeInitializingSet(scoped_ptr<EntrySet> index_file_entries, |
| cache_size_ += it->second.GetEntrySize(); |
| } |
| } |
| - last_write_to_disk_ = base::Time::Now(); |
| initialized_ = true; |
| removed_entries_.clear(); |
| @@ -363,11 +364,31 @@ void SimpleIndex::MergeInitializingSet(scoped_ptr<EntrySet> index_file_entries, |
| to_run_when_initialized_.clear(); |
| } |
| +#if defined(OS_ANDROID) |
| +void SimpleIndex::ActivityStatusChanged( |
| + net::SimpleCacheActivityStatusNotifier::ActivityStatus activity_status) { |
| + DCHECK(io_thread_checker_.CalledOnValidThread()); |
| + // These values are defined in the file ActivityStatus.java |
| + if (activity_status == net::SimpleCacheActivityStatusNotifier::RESUMED) { |
| + app_on_background_ = false; |
| + } else if (activity_status == |
| + net::SimpleCacheActivityStatusNotifier::PAUSED) { |
| + app_on_background_ = true; |
| + WriteToDisk(); |
| + } else if (activity_status == |
| + net::SimpleCacheActivityStatusNotifier::STOPPED) { |
| + WriteToDisk(); |
| + } else if (activity_status == |
| + net::SimpleCacheActivityStatusNotifier::DESTROYED) { |
| + WriteToDisk(); |
| + } |
| +} |
| +#endif |
| + |
| void SimpleIndex::WriteToDisk() { |
| DCHECK(io_thread_checker_.CalledOnValidThread()); |
| if (!initialized_) |
| return; |
| - last_write_to_disk_ = base::Time::Now(); |
| SimpleIndexFile::IndexMetadata index_metadata(entries_set_.size(), |
| cache_size_); |
| scoped_ptr<Pickle> pickle = SimpleIndexFile::Serialize(index_metadata, |