15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NET_DISK_CACHE_BLOCKFILE_EVICTION_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define NET_DISK_CACHE_BLOCKFILE_EVICTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/rankings.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disk_cache {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendImpl;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EntryImpl;
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct IndexHeader;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements the eviction algorithm for the cache and it is tightly
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// integrated with BackendImpl.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Eviction {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Eviction();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Eviction();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(BackendImpl* backend);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Stop();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes entries from the cache until the current size is below the limit.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If empty is true, the whole cache will be trimmed, regardless of being in
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TrimCache(bool empty);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the ranking information for an entry.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateRank(EntryImpl* entry, bool modified);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications of interesting events for a given entry.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnOpenEntry(EntryImpl* entry);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateEntry(EntryImpl* entry);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDoomEntry(EntryImpl* entry);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDestroyEntry(EntryImpl* entry);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Testing interface.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTestMode();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TrimDeletedList(bool empty);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostDelayedTrim();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DelayedTrim();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldTrim();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldTrimDeleted();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportTrimTimes(EntryImpl* entry);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rankings::List GetListForEntry(EntryImpl* entry);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool EvictEntry(CacheRankingsBlock* node, bool empty, Rankings::List list);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We'll just keep for a while a separate set of methods that implement the
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new eviction algorithm. This code will replace the original methods when
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // finished.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TrimCacheV2(bool empty);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateRankV2(EntryImpl* entry, bool modified);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnOpenEntryV2(EntryImpl* entry);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateEntryV2(EntryImpl* entry);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDoomEntryV2(EntryImpl* entry);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDestroyEntryV2(EntryImpl* entry);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rankings::List GetListForEntryV2(EntryImpl* entry);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TrimDeleted(bool empty);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RemoveDeletedNode(CacheRankingsBlock* node);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool NodeIsOldEnough(CacheRankingsBlock* node, int list);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int SelectListByLength(Rankings::ScopedRankingsBlock* next);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportListStats();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendImpl* backend_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rankings* rankings_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexHeader* header_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_size_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int trim_delays_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index_size_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool new_eviction_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool first_trim_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trimming_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool delay_trim_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool init_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool test_mode_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<Eviction> ptr_factory_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Eviction);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace disk_cache
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // NET_DISK_CACHE_BLOCKFILE_EVICTION_H_
92