summaryrefslogtreecommitdiffstats
path: root/net/disk_cache/backend_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/disk_cache/backend_impl.cc')
-rw-r--r--net/disk_cache/backend_impl.cc82
1 files changed, 8 insertions, 74 deletions
diff --git a/net/disk_cache/backend_impl.cc b/net/disk_cache/backend_impl.cc
index 23b0f9dc..710f8bd 100644
--- a/net/disk_cache/backend_impl.cc
+++ b/net/disk_cache/backend_impl.cc
@@ -23,7 +23,6 @@ using base::TimeDelta;
namespace {
const wchar_t* kIndexName = L"index";
-const int kCleanUpMargin = 1024 * 1024;
const int kMaxOldFolders = 100;
// Seems like ~240 MB correspond to less than 50k entries for 99% of the people.
@@ -54,13 +53,6 @@ size_t GetIndexSize(int table_len) {
return sizeof(disk_cache::IndexHeader) + table_size;
}
-int LowWaterAdjust(int high_water) {
- if (high_water < kCleanUpMargin)
- return 0;
-
- return high_water - kCleanUpMargin;
-}
-
// ------------------------------------------------------------------------
// Returns a fully qualified name from path and name, using a given name prefix
@@ -248,6 +240,7 @@ bool BackendImpl::Init() {
return false;
disabled_ = !rankings_.Init(this);
+ eviction_.Init(this);
return !disabled_;
}
@@ -287,6 +280,7 @@ bool BackendImpl::OpenEntry(const std::string& key, Entry** entry) {
return false;
}
+ eviction_.OnOpenEntry(cache_entry);
DCHECK(entry);
*entry = cache_entry;
@@ -355,7 +349,7 @@ bool BackendImpl::CreateEntry(const std::string& key, Entry** entry) {
data_->header.num_entries++;
DCHECK(data_->header.num_entries > 0);
- rankings_.Insert(cache_entry->rankings(), true, Rankings::NO_USE);
+ eviction_.OnCreateEntry(cache_entry);
if (!parent.get())
data_->table[hash & mask_] = entry_address.value();
@@ -394,7 +388,7 @@ bool BackendImpl::DoomAllEntries() {
if (disabled_)
return false;
- TrimCache(true);
+ eviction_.TrimCache(true);
stats_.OnEvent(Stats::DOOM_CACHE);
return true;
}
@@ -575,7 +569,7 @@ LruData* BackendImpl::GetLruData() {
void BackendImpl::UpdateRank(EntryImpl* entry, bool modified) {
if (!read_only_) {
- rankings_.UpdateRank(entry->rankings(), modified, Rankings::NO_USE);
+ eviction_.UpdateRank(entry, modified);
}
}
@@ -604,8 +598,7 @@ void BackendImpl::InternalDoomEntry(EntryImpl* entry) {
Trace("Doom entry 0x%p", entry);
- rankings_.Remove(entry->rankings(), Rankings::NO_USE);
-
+ eviction_.OnDoomEntry(entry);
entry->InternalDoom();
if (parent_entry) {
@@ -1020,9 +1013,9 @@ void BackendImpl::DestroyInvalidEntry(Addr address, EntryImpl* entry) {
LOG(WARNING) << "Destroying invalid entry.";
Trace("Destroying invalid entry 0x%p", entry);
- rankings_.Remove(entry->rankings(), Rankings::NO_USE);
entry->SetPointerForInvalidEntry(GetCurrentEntryId());
+ eviction_.OnDoomEntry(entry);
entry->InternalDoom();
data_->header.num_entries--;
@@ -1030,71 +1023,12 @@ void BackendImpl::DestroyInvalidEntry(Addr address, EntryImpl* entry) {
stats_.OnEvent(Stats::INVALID_ENTRY);
}
-void BackendImpl::TrimCache(bool empty) {
- Trace("*** Trim Cache ***");
- if (disabled_)
- return;
-
- Time start = Time::Now();
- Rankings::ScopedRankingsBlock node(&rankings_);
- Rankings::ScopedRankingsBlock next(&rankings_,
- rankings_.GetPrev(node.get(), Rankings::NO_USE));
- DCHECK(next.get());
- int target_size = empty ? 0 : LowWaterAdjust(max_size_);
- int deleted = 0;
- while (data_->header.num_bytes > target_size && next.get()) {
- node.reset(next.release());
- next.reset(rankings_.GetPrev(node.get(), Rankings::NO_USE));
- if (!node->Data()->pointer || empty) {
- // This entry is not being used by anybody.
- EntryImpl* entry;
- bool dirty;
- if (NewEntry(Addr(node->Data()->contents), &entry, &dirty)) {
- Trace("NewEntry failed on Trim 0x%x", node->address().value());
- continue;
- }
-
- if (node->Data()->pointer) {
- entry = EntryImpl::Update(entry);
- }
- ReportTrimTimes(entry);
- entry->Doom();
- entry->Release();
- if (!empty)
- stats_.OnEvent(Stats::TRIM_ENTRY);
- if (++deleted == 4 && !empty) {
-#if defined(OS_WIN)
- MessageLoop::current()->PostTask(FROM_HERE,
- factory_.NewRunnableMethod(&BackendImpl::TrimCache, false));
- break;
-#endif
- }
- }
- }
-
- UMA_HISTOGRAM_TIMES(L"DiskCache.TotalTrimTime", Time::Now() - start);
- Trace("*** Trim Cache end ***");
- return;
-}
-
-void BackendImpl::ReportTrimTimes(EntryImpl* entry) {
- static bool first_time = true;
- if (first_time) {
- first_time = false;
- std::wstring name(StringPrintf(L"DiskCache.TrimAge_%d",
- data_->header.experiment));
- static Histogram counter(name.c_str(), 1, 10000, 50);
- counter.SetFlags(kUmaTargetedHistogramFlag);
- counter.Add((Time::Now() - entry->GetLastUsed()).InHours());
- }
-}
-
void BackendImpl::AddStorageSize(int32 bytes) {
data_->header.num_bytes += bytes;
DCHECK(data_->header.num_bytes >= 0);
if (data_->header.num_bytes > max_size_)
- TrimCache(false);
+ eviction_.TrimCache(false);
}
void BackendImpl::SubstractStorageSize(int32 bytes) {