| Index: net/disk_cache/blockfile/index_table_v3.h
|
| diff --git a/net/disk_cache/blockfile/index_table_v3.h b/net/disk_cache/blockfile/index_table_v3.h
|
| deleted file mode 100644
|
| index 598aeecf8a7cb72251b1d42f4215393e4ff15867..0000000000000000000000000000000000000000
|
| --- a/net/disk_cache/blockfile/index_table_v3.h
|
| +++ /dev/null
|
| @@ -1,279 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef NET_DISK_CACHE_BLOCKFILE_INDEX_TABLE_V3_H_
|
| -#define NET_DISK_CACHE_BLOCKFILE_INDEX_TABLE_V3_H_
|
| -
|
| -// The IndexTable class is in charge of handling all the details about the main
|
| -// index table of the cache. It provides methods to locate entries in the cache,
|
| -// create new entries and modify existing entries. It hides the fact that the
|
| -// table is backed up across multiple physical files, and that the files can
|
| -// grow and be remapped while the cache is in use. However, note that this class
|
| -// doesn't do any direct management of the backing files, and it operates only
|
| -// with the tables in memory.
|
| -//
|
| -// When the current index needs to grow, the backend is notified so that files
|
| -// are extended and remapped as needed. After that, the IndexTable should be
|
| -// re-initialized with the new structures. Note that the IndexTable instance is
|
| -// still functional while the backend performs file IO.
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/time/time.h"
|
| -#include "net/base/net_export.h"
|
| -#include "net/disk_cache/blockfile/addr.h"
|
| -#include "net/disk_cache/blockfile/bitmap.h"
|
| -#include "net/disk_cache/blockfile/disk_format_v3.h"
|
| -
|
| -namespace net {
|
| -class IOBuffer;
|
| -}
|
| -
|
| -namespace disk_cache {
|
| -
|
| -class BackendImplV3;
|
| -struct InitResult;
|
| -
|
| -// An EntryCell represents a single entity stored by the index table. Users are
|
| -// expected to handle and store EntryCells on their own to track operations that
|
| -// they are performing with a given entity, as opposed to deal with pointers to
|
| -// individual positions on the table, given that the whole table can be moved to
|
| -// another place, and that would invalidate any pointers to individual cells in
|
| -// the table.
|
| -// However, note that it is also possible for an entity to be moved from one
|
| -// position to another, so an EntryCell may be invalid by the time a long
|
| -// operation completes. In that case, the caller should consult the table again
|
| -// using FindEntryCell().
|
| -class NET_EXPORT_PRIVATE EntryCell {
|
| - public:
|
| - ~EntryCell();
|
| -
|
| - bool IsValid() const;
|
| -
|
| - int32 cell_num() const { return cell_num_; }
|
| - uint32 hash() const { return hash_; }
|
| -
|
| - Addr GetAddress() const;
|
| - EntryState GetState() const;
|
| - EntryGroup GetGroup() const;
|
| - int GetReuse() const;
|
| - int GetTimestamp() const;
|
| -
|
| - void SetState(EntryState state);
|
| - void SetGroup(EntryGroup group);
|
| - void SetReuse(int count);
|
| - void SetTimestamp(int timestamp);
|
| -
|
| - static EntryCell GetEntryCellForTest(int32 cell_num,
|
| - uint32 hash,
|
| - Addr address,
|
| - IndexCell* cell,
|
| - bool small_table);
|
| - void SerializaForTest(IndexCell* destination);
|
| -
|
| - private:
|
| - friend class IndexTable;
|
| - friend class CacheDumperHelper;
|
| -
|
| - EntryCell();
|
| - EntryCell(int32 cell_num, uint32 hash, Addr address, bool small_table);
|
| - EntryCell(int32 cell_num,
|
| - uint32 hash,
|
| - const IndexCell& cell,
|
| - bool small_table);
|
| -
|
| - void Clear() { cell_.Clear(); }
|
| - void FixSum();
|
| -
|
| - // Returns the raw value stored on the index table.
|
| - uint32 GetLocation() const;
|
| -
|
| - // Recalculates hash_ assuming that only the low order bits are valid and the
|
| - // rest come from cell_.
|
| - uint32 RecomputeHash();
|
| -
|
| - void Serialize(IndexCell* destination) const;
|
| -
|
| - int32 cell_num_;
|
| - uint32 hash_;
|
| - IndexCell cell_;
|
| - bool small_table_;
|
| -};
|
| -
|
| -// Keeps a collection of EntryCells in order to be processed.
|
| -struct NET_EXPORT_PRIVATE EntrySet {
|
| - EntrySet();
|
| - ~EntrySet();
|
| -
|
| - int evicted_count; // The numebr of evicted entries in this set.
|
| - size_t current; // The number of the cell that is being processed.
|
| - std::vector<EntryCell> cells;
|
| -};
|
| -
|
| -// A given entity referenced by the index table is uniquely identified by the
|
| -// combination of hash and address.
|
| -struct CellInfo { uint32 hash; Addr address; };
|
| -typedef std::vector<CellInfo> CellList;
|
| -
|
| -// An index iterator is used to get a group of cells that share the same
|
| -// timestamp. When this structure is passed to GetNextCells(), the caller sets
|
| -// the initial timestamp and direction; whet it is used with GetOldest, the
|
| -// initial values are ignored.
|
| -struct NET_EXPORT_PRIVATE IndexIterator {
|
| - IndexIterator();
|
| - ~IndexIterator();
|
| -
|
| - CellList cells;
|
| - int timestamp; // The current low resolution timestamp for |cells|.
|
| - bool forward; // The direction of the iteration, in time.
|
| -};
|
| -
|
| -// Methods that the backend has to implement to support the table. Note that the
|
| -// backend is expected to own all IndexTable instances, so it is expected to
|
| -// outlive the table.
|
| -class NET_EXPORT_PRIVATE IndexTableBackend {
|
| - public:
|
| - virtual ~IndexTableBackend() {}
|
| -
|
| - // The index has to grow.
|
| - virtual void GrowIndex() = 0;
|
| -
|
| - // Save the index to the backup file.
|
| - virtual void SaveIndex(net::IOBuffer* buffer, int buffer_len) = 0;
|
| -
|
| - // Deletes or fixes an invalid cell from the backend.
|
| - virtual void DeleteCell(EntryCell cell) = 0;
|
| - virtual void FixCell(EntryCell cell) = 0;
|
| -};
|
| -
|
| -// The data required to initialize an index. Note that not all fields have to
|
| -// be provided when growing the tables.
|
| -struct NET_EXPORT_PRIVATE IndexTableInitData {
|
| - IndexTableInitData();
|
| - ~IndexTableInitData();
|
| -
|
| - IndexBitmap* index_bitmap;
|
| - IndexBucket* main_table;
|
| - IndexBucket* extra_table;
|
| - scoped_ptr<IndexHeaderV3> backup_header;
|
| - scoped_ptr<uint32[]> backup_bitmap;
|
| -};
|
| -
|
| -// See the description at the top of this file.
|
| -class NET_EXPORT_PRIVATE IndexTable {
|
| - public:
|
| - explicit IndexTable(IndexTableBackend* backend);
|
| - ~IndexTable();
|
| -
|
| - // Initializes the object, or re-initializes it when the backing files grow.
|
| - // Note that the only supported way to initialize this objeect is using
|
| - // pointers that come from the files being directly mapped in memory. If that
|
| - // is not the case, it must be emulated in a convincing way, for example
|
| - // making sure that the tables for re-init look the same as the tables to be
|
| - // replaced.
|
| - void Init(IndexTableInitData* params);
|
| -
|
| - // Releases the resources acquired during Init().
|
| - void Shutdown();
|
| -
|
| - // Locates a resouce on the index. Returns a list of all resources that match
|
| - // the provided hash.
|
| - EntrySet LookupEntries(uint32 hash);
|
| -
|
| - // Creates a new cell to store a new resource.
|
| - EntryCell CreateEntryCell(uint32 hash, Addr address);
|
| -
|
| - // Locates a particular cell. This method allows a caller to perform slow
|
| - // operations with some entries while the index evolves, by returning the
|
| - // current state of a cell. If the desired cell cannot be located, the return
|
| - // object will be invalid.
|
| - EntryCell FindEntryCell(uint32 hash, Addr address);
|
| -
|
| - // Returns an IndexTable timestamp for a given absolute time. The actual
|
| - // resolution of the timestamp should be considered an implementation detail,
|
| - // but it certainly is lower than seconds. The important part is that a group
|
| - // of cells will share the same timestamp (see IndexIterator).
|
| - int CalculateTimestamp(base::Time time);
|
| -
|
| - // Returns the equivalent time for a cell timestamp.
|
| - base::Time TimeFromTimestamp(int timestamp);
|
| -
|
| - // Updates a particular cell.
|
| - void SetSate(uint32 hash, Addr address, EntryState state);
|
| - void UpdateTime(uint32 hash, Addr address, base::Time current);
|
| -
|
| - // Saves the contents of |cell| to the table.
|
| - void Save(EntryCell* cell);
|
| -
|
| - // Returns the oldest entries for each group of entries. The initial values
|
| - // for the provided iterators are ignored. Entries are assigned to iterators
|
| - // according to their EntryGroup.
|
| - void GetOldest(IndexIterator* no_use,
|
| - IndexIterator* low_use,
|
| - IndexIterator* high_use);
|
| -
|
| - // Returns the next group of entries for the provided iterator. This method
|
| - // does not return the cells matching the initial iterator's timestamp,
|
| - // but rather cells after (or before, depending on the iterator's |forward|
|
| - // member) that timestamp.
|
| - bool GetNextCells(IndexIterator* iterator);
|
| -
|
| - // Called each time the index should save the backup information. The caller
|
| - // can assume that anything that needs to be saved is saved when this method
|
| - // is called, and that there is only one source of timming information, and
|
| - // that source is controlled by the owner of this object.
|
| - void OnBackupTimer();
|
| -
|
| - IndexHeaderV3* header() { return header_; }
|
| - const IndexHeaderV3* header() const { return header_; }
|
| -
|
| - private:
|
| - EntryCell FindEntryCellImpl(uint32 hash, Addr address, bool allow_deleted);
|
| - void CheckState(const EntryCell& cell);
|
| - void Write(const EntryCell& cell);
|
| - int NewExtraBucket();
|
| - void WalkTables(int limit_time,
|
| - IndexIterator* no_use,
|
| - IndexIterator* low_use,
|
| - IndexIterator* high_use);
|
| - void UpdateFromBucket(IndexBucket* bucket, int bucket_hash,
|
| - int limit_time,
|
| - IndexIterator* no_use,
|
| - IndexIterator* low_use,
|
| - IndexIterator* high_use);
|
| - void MoveCells(IndexBucket* old_extra_table);
|
| - void MoveSingleCell(IndexCell* current_cell, int cell_num,
|
| - int main_table_index, bool growing);
|
| - void HandleMisplacedCell(IndexCell* current_cell, int cell_num,
|
| - int main_table_index);
|
| - void CheckBucketList(int bucket_id);
|
| -
|
| - uint32 GetLocation(const IndexCell& cell);
|
| - uint32 GetHashValue(const IndexCell& cell);
|
| - uint32 GetFullHash(const IndexCell& cell, uint32 lower_part);
|
| - bool IsHashMatch(const IndexCell& cell, uint32 hash);
|
| - bool MisplacedHash(const IndexCell& cell, uint32 hash);
|
| -
|
| - IndexTableBackend* backend_;
|
| - IndexHeaderV3* header_;
|
| - scoped_ptr<Bitmap> bitmap_;
|
| - scoped_ptr<Bitmap> backup_bitmap_;
|
| - scoped_ptr<uint32[]> backup_bitmap_storage_;
|
| - scoped_ptr<IndexHeaderV3> backup_header_;
|
| - IndexBucket* main_table_;
|
| - IndexBucket* extra_table_;
|
| - uint32 mask_; // Binary mask to map a hash to the hash table.
|
| - int extra_bits_; // How many bits are in mask_ above the default value.
|
| - bool modified_;
|
| - bool small_table_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(IndexTable);
|
| -};
|
| -
|
| -} // namespace disk_cache
|
| -
|
| -#endif // NET_DISK_CACHE_BLOCKFILE_INDEX_TABLE_V3_H_
|
|
|