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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See net/disk_cache/disk_cache.h for the public interface.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NET_DISK_CACHE_BLOCKFILE_RANKINGS_H_
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define NET_DISK_CACHE_BLOCKFILE_RANKINGS_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/addr.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/mapped_file.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/storage_block.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disk_cache {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendImpl;
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct LruData;
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct RankingsNode;
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)typedef StorageBlock<RankingsNode> CacheRankingsBlock;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Type of crashes generated for the unit tests.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum RankCrashes {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NO_CRASH = 0,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_EMPTY_1,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_EMPTY_2,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_EMPTY_3,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_ONE_1,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_ONE_2,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_ONE_3,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_LOAD_1,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INSERT_LOAD_2,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_ONE_1,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_ONE_2,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_ONE_3,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_ONE_4,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_HEAD_1,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_HEAD_2,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_HEAD_3,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_HEAD_4,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_TAIL_1,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_TAIL_2,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_TAIL_3,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_LOAD_1,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_LOAD_2,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REMOVE_LOAD_3,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_CRASH
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class handles the ranking information for the cache.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rankings {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Possible lists of entries.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum List {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NO_USE = 0,   // List of entries that have not been reused.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOW_USE,      // List of entries with low reuse.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HIGH_USE,     // List of entries with high reuse.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RESERVED,     // Reserved for future use.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DELETED,      // List of recently deleted or doomed entries.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAST_ELEMENT
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This class provides a specialized version of scoped_ptr, that calls
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rankings whenever a CacheRankingsBlock is deleted, to keep track of cache
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // iterators that may go stale.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ScopedRankingsBlock : public scoped_ptr<CacheRankingsBlock> {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedRankingsBlock();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit ScopedRankingsBlock(Rankings* rankings);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedRankingsBlock(Rankings* rankings, CacheRankingsBlock* node);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~ScopedRankingsBlock() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rankings_->FreeRankingsBlock(get());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_rankings(Rankings* rankings) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rankings_ = rankings;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // scoped_ptr::reset will delete the object.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void reset(CacheRankingsBlock* p = NULL) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (p != get())
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rankings_->FreeRankingsBlock(get());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<CacheRankingsBlock>::reset(p);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Rankings* rankings_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedRankingsBlock);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have multiple lists, we have to iterate through all at the same time.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This structure keeps track of where we are on the iteration.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Iterator {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Iterator();
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    void Reset();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    List list;                     // Which entry was returned to the user.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CacheRankingsBlock* nodes[3];  // Nodes on the first three lists.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Rankings* my_rankings;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rankings();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Rankings();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(BackendImpl* backend, bool count_lists);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restores original state, leaving the object ready for initialization.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inserts a given entry at the head of the queue.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Insert(CacheRankingsBlock* node, bool modified, List list);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a given entry from the LRU list. If |strict| is true, this method
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // assumes that |node| is not pointed to by an active iterator. On the other
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hand, removing that restriction allows the current "head" of an iterator
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be removed from the list (basically without control of the code that is
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // performing the iteration), so it should be used with extra care.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Remove(CacheRankingsBlock* node, List list, bool strict);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Moves a given entry to the head.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateRank(CacheRankingsBlock* node, bool modified, List list);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterates through the list.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CacheRankingsBlock* GetNext(CacheRankingsBlock* node, List list);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CacheRankingsBlock* GetPrev(CacheRankingsBlock* node, List list);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FreeRankingsBlock(CacheRankingsBlock* node);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Controls tracking of nodes used for enumerations.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TrackRankingsBlock(CacheRankingsBlock* node, bool start_tracking);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Peforms a simple self-check of the lists, and returns the number of items
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or an error code (negative value).
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int SelfCheck();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the entry is clearly invalid. from_list is true if the
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // node comes from the LRU list.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SanityCheck(CacheRankingsBlock* node, bool from_list) const;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DataSanityCheck(CacheRankingsBlock* node, bool from_list) const;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the |contents| field of |node| to |address|.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetContents(CacheRankingsBlock* node, CacheAddr address);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<CacheAddr, CacheRankingsBlock*> IteratorPair;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<IteratorPair> IteratorList;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadHeads();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadTails();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteHead(List list);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteTail(List list);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the rankings information for a given rankings node. We may end up
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sharing the actual memory with a loaded entry, but we are not taking a
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reference to that entry, so |rankings| must be short lived.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetRanking(CacheRankingsBlock* rankings);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes |rankings| suitable to live a long life.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ConvertToLongLived(CacheRankingsBlock* rankings);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finishes a list modification after a crash.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CompleteTransaction();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishInsert(CacheRankingsBlock* rankings);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RevertRemove(CacheRankingsBlock* rankings);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if node is not properly linked. This method may change the
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provided |list| to reflect the list where this node is actually stored.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckLinks(CacheRankingsBlock* node, CacheRankingsBlock* prev,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  CacheRankingsBlock* next, List* list);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks the links between two consecutive nodes.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckSingleLink(CacheRankingsBlock* prev, CacheRankingsBlock* next);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Peforms a simple check of the list, and returns the number of items or an
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error code (negative value).
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CheckList(List list);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Walks a list in the desired direction until the nodes |end1| or |end2| are
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reached. Returns an error code (0 on success), the number of items verified
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the addresses of the last nodes visited.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CheckListSection(List list, Addr end1, Addr end2, bool forward,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Addr* last, Addr* second_last, int* num_items);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if addr is the head or tail of any list. When there is a
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // match |list| will contain the list number for |addr|.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsHead(CacheAddr addr, List* list) const;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTail(CacheAddr addr, List* list) const;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the iterators whenever node is being changed.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateIterators(CacheRankingsBlock* node);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalidates the iterators pointing to this node.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InvalidateIterators(CacheRankingsBlock* node);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of the number of entries on a list.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncrementCounter(List list);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecrementCounter(List list);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool init_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool count_lists_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Addr heads_[LAST_ELEMENT];
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Addr tails_[LAST_ELEMENT];
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendImpl* backend_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LruData* control_data_;  // Data related to the LRU lists.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IteratorList iterators_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Rankings);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace disk_cache
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // NET_DISK_CACHE_BLOCKFILE_RANKINGS_H_
215