1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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// See net/disk_cache/disk_cache.h for the public interface.
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_DISK_CACHE_RANKINGS_H_
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_DISK_CACHE_RANKINGS_H_
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <list>
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/addr.h"
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mapped_file.h"
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/storage_block.h"
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass BackendImpl;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Type of crashes generated for the unit tests.
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum RankCrashes {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  NO_CRASH = 0,
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_EMPTY_1,
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_EMPTY_2,
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_EMPTY_3,
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_ONE_1,
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_ONE_2,
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_ONE_3,
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_LOAD_1,
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  INSERT_LOAD_2,
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_ONE_1,
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_ONE_2,
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_ONE_3,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_ONE_4,
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_HEAD_1,
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_HEAD_2,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_HEAD_3,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_HEAD_4,
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_TAIL_1,
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_TAIL_2,
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_TAIL_3,
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_LOAD_1,
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_LOAD_2,
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  REMOVE_LOAD_3,
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MAX_CRASH
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class handles the ranking information for the cache.
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Rankings {
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Possible lists of entries.
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  enum List {
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NO_USE = 0,   // List of entries that have not been reused.
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    LOW_USE,      // List of entries with low reuse.
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    HIGH_USE,     // List of entries with high reuse.
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    RESERVED,     // Reserved for future use.
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    DELETED,      // List of recently deleted or doomed entries.
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    LAST_ELEMENT
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This class provides a specialized version of scoped_ptr, that calls
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Rankings whenever a CacheRankingsBlock is deleted, to keep track of cache
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // iterators that may go stale.
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  class ScopedRankingsBlock : public scoped_ptr<CacheRankingsBlock> {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott   public:
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedRankingsBlock() : rankings_(NULL) {}
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    explicit ScopedRankingsBlock(Rankings* rankings) : rankings_(rankings) {}
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedRankingsBlock(Rankings* rankings, CacheRankingsBlock* node)
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        : scoped_ptr<CacheRankingsBlock>(node), rankings_(rankings) {}
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ~ScopedRankingsBlock() {
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      rankings_->FreeRankingsBlock(get());
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    void set_rankings(Rankings* rankings) {
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      rankings_ = rankings;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // scoped_ptr::reset will delete the object.
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    void reset(CacheRankingsBlock* p = NULL) {
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      if (p != get())
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rankings_->FreeRankingsBlock(get());
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      scoped_ptr<CacheRankingsBlock>::reset(p);
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott   private:
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    Rankings* rankings_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DISALLOW_COPY_AND_ASSIGN(ScopedRankingsBlock);
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If we have multiple lists, we have to iterate through all at the same time.
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This structure keeps track of where we are on the iteration.
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct Iterator {
963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    explicit Iterator(Rankings* rankings);
973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    ~Iterator();
983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    List list;                     // Which entry was returned to the user.
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    CacheRankingsBlock* nodes[3];  // Nodes on the first three lists.
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    Rankings* my_rankings;
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Rankings();
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ~Rankings();
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool Init(BackendImpl* backend, bool count_lists);
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Restores original state, leaving the object ready for initialization.
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Reset();
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Inserts a given entry at the head of the queue.
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Insert(CacheRankingsBlock* node, bool modified, List list);
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  // Removes a given entry from the LRU list. If |strict| is true, this method
116efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  // assumes that |node| is not pointed to by an active iterator. On the other
117efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  // hand, removing that restriction allows the current "head" of an iterator
118efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  // to be removed from the list (basically without control of the code that is
119efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  // performing the iteration), so it should be used with extra care.
120efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  void Remove(CacheRankingsBlock* node, List list, bool strict);
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Moves a given entry to the head.
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void UpdateRank(CacheRankingsBlock* node, bool modified, List list);
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Iterates through the list.
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CacheRankingsBlock* GetNext(CacheRankingsBlock* node, List list);
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CacheRankingsBlock* GetPrev(CacheRankingsBlock* node, List list);
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void FreeRankingsBlock(CacheRankingsBlock* node);
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Controls tracking of nodes used for enumerations.
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TrackRankingsBlock(CacheRankingsBlock* node, bool start_tracking);
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Peforms a simple self-check of the lists, and returns the number of items
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // or an error code (negative value).
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int SelfCheck();
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns false if the entry is clearly invalid. from_list is true if the
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // node comes from the LRU list.
139efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  bool SanityCheck(CacheRankingsBlock* node, bool from_list) const;
140efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  bool DataSanityCheck(CacheRankingsBlock* node, bool from_list) const;
141efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen
142efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  // Sets the |contents| field of |node| to |address|.
143efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  void SetContents(CacheRankingsBlock* node, CacheAddr address);
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef std::pair<CacheAddr, CacheRankingsBlock*> IteratorPair;
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef std::list<IteratorPair> IteratorList;
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ReadHeads();
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ReadTails();
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void WriteHead(List list);
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void WriteTail(List list);
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets the rankings information for a given rankings node. We may end up
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // sharing the actual memory with a loaded entry, but we are not taking a
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // reference to that entry, so |rankings| must be short lived.
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool GetRanking(CacheRankingsBlock* rankings);
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Makes |rankings| suitable to live a long life.
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ConvertToLongLived(CacheRankingsBlock* rankings);
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Finishes a list modification after a crash.
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void CompleteTransaction();
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void FinishInsert(CacheRankingsBlock* rankings);
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void RevertRemove(CacheRankingsBlock* rankings);
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns false if this entry will not be recognized as dirty (called during
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // selfcheck).
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool CheckEntry(CacheRankingsBlock* rankings);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns false if node is not properly linked. This method may change the
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // provided |list| to reflect the list where this node is actually stored.
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool CheckLinks(CacheRankingsBlock* node, CacheRankingsBlock* prev,
1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                  CacheRankingsBlock* next, List* list);
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Checks the links between two consecutive nodes.
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool CheckSingleLink(CacheRankingsBlock* prev, CacheRankingsBlock* next);
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Peforms a simple check of the list, and returns the number of items or an
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // error code (negative value).
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int CheckList(List list);
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns true if addr is the head or tail of any list. When there is a
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // match |list| will contain the list number for |addr|.
185efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  bool IsHead(CacheAddr addr, List* list) const;
186efe273f2861c2ea723aa1f9edd20a73356da2b6bKristian Monsen  bool IsTail(CacheAddr addr, List* list) const;
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Updates the iterators whenever node is being changed.
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void UpdateIterators(CacheRankingsBlock* node);
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalidates the iterators pointing to this node.
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void InvalidateIterators(CacheRankingsBlock* node);
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Keeps track of the number of entries on a list.
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void IncrementCounter(List list);
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void DecrementCounter(List list);
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool init_;
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool count_lists_;
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Addr heads_[LAST_ELEMENT];
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Addr tails_[LAST_ELEMENT];
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BackendImpl* backend_;
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LruData* control_data_;  // Data related to the LRU lists.
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  IteratorList iterators_;
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DISALLOW_COPY_AND_ASSIGN(Rankings);
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace disk_cache
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_DISK_CACHE_RANKINGS_H_
212