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