1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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_STORAGE_BLOCK_H__ 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_DISK_CACHE_STORAGE_BLOCK_H__ 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/addr.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mapped_file.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache { 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class encapsulates common behavior of a single "block" of data that is 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// stored on a block-file. It implements the FileBlock interface, so it can be 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// serialized directly to the backing file. 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This object provides a memory buffer for the related data, and it can be used 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to actually share that memory with another instance of the class. 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The following example shows how to share storage with another object: 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// StorageBlock<TypeA> a(file, address); 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// StorageBlock<TypeB> b(file, address); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a.Load(); 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DoSomething(a.Data()); 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// b.SetData(a.Data()); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ModifySomething(b.Data()); 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// // Data modified on the previous call will be saved by b's destructor. 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// b.set_modified(); 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate<typename T> 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass StorageBlock : public FileBlock { 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott StorageBlock(MappedFile* file, Addr address); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~StorageBlock(); 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // FileBlock interface. 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void* buffer() const; 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual size_t size() const; 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual int offset() const; 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Allows the overide of dummy values passed on the constructor. 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool LazyInit(MappedFile* file, Addr address); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Sets the internal storage to share the memory provided by other instance. 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void SetData(T* other); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes the data, even if it was modified and not saved. This object must 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // own the memory buffer (it cannot be shared). 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void Discard(); 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Stops sharing the data with another object. 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void StopSharingData(); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Sets the object to lazily save the in-memory data on destruction. 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void set_modified(); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets a pointer to the internal storage (allocates storage if needed). 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott T* Data(); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if there is data associated with this object. 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool HasData() const; 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if this object owns the data buffer, false if it is shared. 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool own_data() const; 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Addr address() const; 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Loads and store the data. 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool Load(); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool Store(); 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AllocateData(); 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DeleteData(); 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott T* data_; 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MappedFile* file_; 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Addr address_; 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool modified_; 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool own_data_; // Is data_ owned by this object or shared with someone else. 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool extended_; // Used to store an entry of more than one block. 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(StorageBlock); 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef StorageBlock<EntryStore> CacheEntryBlock; 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef StorageBlock<RankingsNode> CacheRankingsBlock; 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace disk_cache 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_DISK_CACHE_STORAGE_BLOCK_H__ 93