| Index: net/disk_cache/block_files.h
|
| ===================================================================
|
| --- net/disk_cache/block_files.h (revision 199883)
|
| +++ net/disk_cache/block_files.h (working copy)
|
| @@ -14,6 +14,7 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "net/base/net_export.h"
|
| #include "net/disk_cache/addr.h"
|
| +#include "net/disk_cache/disk_format_base.h"
|
| #include "net/disk_cache/mapped_file.h"
|
|
|
| namespace base {
|
| @@ -22,6 +23,60 @@
|
|
|
| namespace disk_cache {
|
|
|
| +// An instance of this class represents the header of a block file in memory.
|
| +// Note that this class doesn't perform any file operation.
|
| +class NET_EXPORT_PRIVATE BlockHeader {
|
| + public:
|
| + BlockHeader();
|
| + explicit BlockHeader(BlockFileHeader* header);
|
| + explicit BlockHeader(MappedFile* file);
|
| + BlockHeader(const BlockHeader& other);
|
| + ~BlockHeader();
|
| +
|
| + // Creates a new entry on the allocation map, updating the apropriate
|
| + // counters. |target| is the type of block to use (number of empty blocks),
|
| + // and |size| is the actual number of blocks to use.
|
| + bool CreateMapBlock(int target, int size, int* index);
|
| +
|
| + // Deletes the block pointed by |index|.
|
| + void DeleteMapBlock(int index, int block_size);
|
| +
|
| + // Returns true if the specified block is used.
|
| + bool UsedMapBlock(int index, int size);
|
| +
|
| + // Restores the "empty counters" and allocation hints.
|
| + void FixAllocationCounters();
|
| +
|
| + // Returns true if the current block file should not be used as-is to store
|
| + // more records. |block_count| is the number of blocks to allocate.
|
| + bool NeedToGrowBlockFile(int block_count);
|
| +
|
| + // Returns true if this block file can be used to store an extra record of
|
| + // size |block_count|.
|
| + bool CanAllocate(int block_count);
|
| +
|
| + // Returns the number of empty blocks for this file.
|
| + int EmptyBlocks() const;
|
| +
|
| + // Returns true if the counters look OK.
|
| + bool ValidateCounters() const;
|
| +
|
| + // Returns the size of the wrapped structure (BlockFileHeader).
|
| + int Size() const;
|
| +
|
| + BlockFileHeader* operator->() { return header_; }
|
| + void operator=(const BlockHeader& other) { header_ = other.header_; }
|
| + BlockFileHeader* Get() { return header_; }
|
| +
|
| + private:
|
| + // Set force to true to overwrite the file if it exists.
|
| + //bool CreateBlockFile(int index, FileType file_type, bool force);
|
| +
|
| + BlockFileHeader* header_;
|
| +};
|
| +
|
| +typedef std::vector<BlockHeader> BlockFilesBitmaps;
|
| +
|
| // This class handles the set of block-files open by the disk cache.
|
| class NET_EXPORT_PRIVATE BlockFiles {
|
| public:
|
| @@ -30,8 +85,11 @@
|
|
|
| // Performs the object initialization. create_files indicates if the backing
|
| // files should be created or just open.
|
| - bool Init(bool create_files);
|
| + bool Init(bool create_files, int num_files);
|
|
|
| + // Returns the allocation bitmaps for all the files managed by this object.
|
| + void GetBitmaps(int num_files, BlockFilesBitmaps* bitmaps);
|
| +
|
| // Returns the file that stores a given address.
|
| MappedFile* GetFile(Addr address);
|
|
|
| @@ -56,13 +114,16 @@
|
| // This method is only intended for debugging.
|
| bool IsValid(Addr address);
|
|
|
| + // Increments the size of files very slowly.
|
| + void UseSmallSizeIncrementsForTest() { small_steps_ = true; }
|
| +
|
| private:
|
| // Set force to true to overwrite the file if it exists.
|
| bool CreateBlockFile(int index, FileType file_type, bool force);
|
| bool OpenBlockFile(int index);
|
|
|
| // Attemp to grow this file. Fails if the file cannot be extended anymore.
|
| - bool GrowBlockFile(MappedFile* file, BlockFileHeader* header);
|
| + bool GrowBlockFile(BlockFileHeader* header);
|
|
|
| // Returns the appropriate file to use for a new block.
|
| MappedFile* FileForNewBlock(FileType block_type, int block_count);
|
| @@ -70,25 +131,40 @@
|
| // Returns the next block file on this chain, creating new files if needed.
|
| MappedFile* NextFile(MappedFile* file);
|
|
|
| + // Returns the file index that stores a given address, or -1 on failure.
|
| + int GetFileIndex(Addr address);
|
| +
|
| + // Returns the header file that stores a given address.
|
| + MappedFile* GetFileHeader(Addr address);
|
| +
|
| // Creates an empty block file and returns its index.
|
| int CreateNextBlockFile(FileType block_type);
|
|
|
| // Removes a chained block file that is now empty.
|
| bool RemoveEmptyFile(FileType block_type);
|
|
|
| + bool PreallocateSpace(FileType block_type);
|
| +
|
| // Restores the header of a potentially inconsistent file.
|
| - bool FixBlockFileHeader(MappedFile* file);
|
| + bool FixBlockFileHeader(int index);
|
|
|
| // Retrieves stats for the given file index.
|
| void GetFileStats(int index, int* used_count, int* load);
|
|
|
| - // Returns the filename for a given file index.
|
| - base::FilePath Name(int index);
|
| + // Returns the filename for the header section, given a file index.
|
| + base::FilePath HeaderName(int index);
|
|
|
| + // Returns the filename for the data portion, given a file index.
|
| + base::FilePath DataName(int index);
|
| +
|
| bool init_;
|
| + bool small_steps_;
|
| + int data_offset_; // Zero for V3.
|
| char* zero_buffer_; // Buffer to speed-up cleaning deleted entries.
|
| base::FilePath path_; // Path to the backing folder.
|
| - std::vector<MappedFile*> block_files_; // The actual files.
|
| + std::vector<MappedFile*> block_headers_; // The block file headers.
|
| + std::vector<MappedFile*> block_data_; // The user data (if not stored with
|
| + // the header).
|
| scoped_ptr<base::ThreadChecker> thread_checker_;
|
|
|
| FRIEND_TEST_ALL_PREFIXES(DiskCacheTest, BlockFiles_ZeroSizeFile);
|
|
|