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