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