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