diff options
author | rvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 22:43:35 +0000 |
---|---|---|
committer | rvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 22:43:35 +0000 |
commit | 8f82f9d9ae8dfd23ab63fb9e63c6246da71d29fd (patch) | |
tree | 3c4308efb534a5585d947882666b86073ae89463 /net/disk_cache/eviction.cc | |
parent | d756326c7c3c4a53ca94bc8d709d13e65c0d6464 (diff) | |
download | chromium_src-8f82f9d9ae8dfd23ab63fb9e63c6246da71d29fd.zip chromium_src-8f82f9d9ae8dfd23ab63fb9e63c6246da71d29fd.tar.gz chromium_src-8f82f9d9ae8dfd23ab63fb9e63c6246da71d29fd.tar.bz2 |
Disk cache: Don't evict entries if we are busy doing other stuff.
BUG=10727
TEST=none
Review URL: http://codereview.chromium.org/155314
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20330 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/disk_cache/eviction.cc')
-rw-r--r-- | net/disk_cache/eviction.cc | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/net/disk_cache/eviction.cc b/net/disk_cache/eviction.cc index 14ffce9..8fb1e1c 100644 --- a/net/disk_cache/eviction.cc +++ b/net/disk_cache/eviction.cc @@ -66,6 +66,7 @@ void Eviction::Init(BackendImpl* backend) { new_eviction_ = backend->new_eviction_; first_trim_ = true; trimming_ = false; + delay_trim_ = false; } void Eviction::TrimCache(bool empty) { @@ -76,6 +77,9 @@ void Eviction::TrimCache(bool empty) { if (backend_->disabled_ || trimming_) return; + if (!empty && backend_->IsLoaded()) + return PostDelayedTrim(); + trimming_ = true; Time start = Time::Now(); Rankings::ScopedRankingsBlock node(rankings_); @@ -83,7 +87,6 @@ void Eviction::TrimCache(bool empty) { rankings_->GetPrev(node.get(), Rankings::NO_USE)); DCHECK(next.get()); int target_size = empty ? 0 : max_size_; - int deleted = 0; while (header_->num_bytes > target_size && next.get()) { node.reset(next.release()); next.reset(rankings_->GetPrev(node.get(), Rankings::NO_USE)); @@ -92,14 +95,14 @@ void Eviction::TrimCache(bool empty) { if (!EvictEntry(node.get(), empty)) continue; - if (!empty) + if (!empty) { backend_->OnEvent(Stats::TRIM_ENTRY); - if (++deleted == 4 && !empty) { -#if defined(OS_WIN) - MessageLoop::current()->PostTask(FROM_HERE, - factory_.NewRunnableMethod(&Eviction::TrimCache, false)); - break; -#endif + + if ((Time::Now() - start).InMilliseconds() > 20) { + MessageLoop::current()->PostTask(FROM_HERE, + factory_.NewRunnableMethod(&Eviction::TrimCache, false)); + break; + } } } } @@ -141,6 +144,20 @@ void Eviction::OnDestroyEntry(EntryImpl* entry) { return OnDestroyEntryV2(entry); } +void Eviction::PostDelayedTrim() { + // Prevent posting multiple tasks. + if (delay_trim_) + return; + delay_trim_ = true; + MessageLoop::current()->PostDelayedTask(FROM_HERE, + factory_.NewRunnableMethod(&Eviction::DelayedTrim), 1000); +} + +void Eviction::DelayedTrim() { + delay_trim_ = false; + TrimCache(false); +} + void Eviction::ReportTrimTimes(EntryImpl* entry) { if (first_trim_) { first_trim_ = false; @@ -211,6 +228,9 @@ void Eviction::TrimCacheV2(bool empty) { if (backend_->disabled_ || trimming_) return; + if (!empty && backend_->IsLoaded()) + return PostDelayedTrim(); + trimming_ = true; Time start = Time::Now(); @@ -248,7 +268,6 @@ void Eviction::TrimCacheV2(bool empty) { Rankings::ScopedRankingsBlock node(rankings_); int target_size = empty ? 0 : max_size_; - int deleted = 0; for (; list < kListsToSearch; list++) { while (header_->num_bytes > target_size && next[list].get()) { node.reset(next[list].release()); @@ -259,7 +278,7 @@ void Eviction::TrimCacheV2(bool empty) { if (!EvictEntry(node.get(), empty)) continue; - if (++deleted == 4 && !empty) { + if (!empty && (Time::Now() - start).InMilliseconds() > 20) { MessageLoop::current()->PostTask(FROM_HERE, factory_.NewRunnableMethod(&Eviction::TrimCache, false)); break; |