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