1a972e26e14066ec50afdaf4582836fe5fc4c190aKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_DISK_CACHE_EVICTION_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_DISK_CACHE_EVICTION_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/task.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_format.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/rankings.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache { 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass BackendImpl; 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass EntryImpl; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class implements the eviction algorithm for the cache and it is tightly 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// integrated with BackendImpl. 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Eviction { 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Eviction(); 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ~Eviction(); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void Init(BackendImpl* backend); 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Stop(); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes entries from the cache until the current size is below the limit. 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If empty is true, the whole cache will be trimmed, regardless of being in 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // use. 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void TrimCache(bool empty); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Updates the ranking information for an entry. 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void UpdateRank(EntryImpl* entry, bool modified); 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Notifications of interesting events for a given entry. 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnOpenEntry(EntryImpl* entry); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnCreateEntry(EntryImpl* entry); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnDoomEntry(EntryImpl* entry); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnDestroyEntry(EntryImpl* entry); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Testing interface. 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void SetTestMode(); 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void TrimDeletedList(bool empty); 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void PostDelayedTrim(); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DelayedTrim(); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ShouldTrim(); 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ReportTrimTimes(EntryImpl* entry); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rankings::List GetListForEntry(EntryImpl* entry); 53efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen bool EvictEntry(CacheRankingsBlock* node, bool empty, Rankings::List list); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We'll just keep for a while a separate set of methods that implement the 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // new eviction algorithm. This code will replace the original methods when 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // finished. 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void TrimCacheV2(bool empty); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void UpdateRankV2(EntryImpl* entry, bool modified); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnOpenEntryV2(EntryImpl* entry); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnCreateEntryV2(EntryImpl* entry); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnDoomEntryV2(EntryImpl* entry); 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnDestroyEntryV2(EntryImpl* entry); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rankings::List GetListForEntryV2(EntryImpl* entry); 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void TrimDeleted(bool empty); 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool RemoveDeletedNode(CacheRankingsBlock* node); 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool NodeIsOldEnough(CacheRankingsBlock* node, int list); 69a972e26e14066ec50afdaf4582836fe5fc4c190aKristian Monsen int SelectListByLength(Rankings::ScopedRankingsBlock* next); 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ReportListStats(); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BackendImpl* backend_; 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rankings* rankings_; 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott IndexHeader* header_; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int max_size_; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int trim_delays_; 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool new_eviction_; 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool first_trim_; 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool trimming_; 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool delay_trim_; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool init_; 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool test_mode_; 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool in_experiment_; 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ScopedRunnableMethodFactory<Eviction> factory_; 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DISALLOW_COPY_AND_ASSIGN(Eviction); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace disk_cache 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_DISK_CACHE_EVICTION_H_ 92