Chromium Code Reviews| Index: storage/browser/blob/blob_storage_context.h |
| diff --git a/storage/browser/blob/blob_storage_context.h b/storage/browser/blob/blob_storage_context.h |
| index eba8abea16e9efa6852b78f3646335120360def4..38ec3e5bcd983d3d7950fe85f48d7f845e602277 100644 |
| --- a/storage/browser/blob/blob_storage_context.h |
| +++ b/storage/browser/blob/blob_storage_context.h |
| @@ -9,14 +9,14 @@ |
| #include <string> |
| #include <vector> |
| +#include "base/callback_forward.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "storage/browser/blob/blob_data_handle.h" |
| -#include "storage/browser/blob/blob_data_item.h" |
| -#include "storage/browser/blob/blob_data_snapshot.h" |
| +#include "storage/browser/blob/blob_storage_registry.h" |
| #include "storage/browser/blob/internal_blob_data.h" |
| -#include "storage/browser/blob/shareable_blob_data_item.h" |
| #include "storage/browser/storage_browser_export.h" |
| +#include "storage/common/blob_storage/blob_storage_constants.h" |
| #include "storage/common/data_element.h" |
| class GURL; |
| @@ -27,13 +27,16 @@ class Time; |
| } |
| namespace content { |
| +class BlobStorageContextTest; |
| class BlobStorageHost; |
| } |
| namespace storage { |
| class BlobDataBuilder; |
| -class InternalBlobData; |
| +class BlobDataItem; |
| +class BlobDataSnapshot; |
| +class ShareableBlobDataItem; |
| // This class handles the logistics of blob Storage within the browser process, |
| // and maintains a mapping from blob uuid to the data. The class is single |
| @@ -65,53 +68,47 @@ class STORAGE_EXPORT BlobStorageContext |
| void RevokePublicBlobURL(const GURL& url); |
| size_t memory_usage() const { return memory_usage_; } |
| - size_t blob_count() const { return blob_map_.size(); } |
| + size_t memory_available() const { |
| + return kBlobStorageMaxMemoryUsage - memory_usage_; |
| + } |
| + |
| + const BlobStorageRegistry& registry() { return registry_; } |
| private: |
| + typedef BlobStorageRegistry::Entry BlobRegistryEntry; |
| friend class content::BlobStorageHost; |
| + friend class content::BlobStorageContextTest; |
| friend class BlobDataHandle::BlobDataHandleShared; |
| friend class ViewBlobInternalsJob; |
| - enum EntryFlags { |
| - EXCEEDED_MEMORY = 1 << 1, |
| - }; |
| - |
| - struct BlobMapEntry { |
| - int refcount; |
| - int flags; |
| - // data and data_builder are mutually exclusive. |
| - scoped_ptr<InternalBlobData> data; |
| - scoped_ptr<InternalBlobData::Builder> data_builder; |
| - |
| - BlobMapEntry(); |
| - BlobMapEntry(int refcount, InternalBlobData::Builder* data); |
| - ~BlobMapEntry(); |
| - |
| - bool IsBeingBuilt(); |
| - }; |
| + void BuildAndStoreBlob(const BlobDataBuilder& external_builder); |
| - typedef std::map<std::string, BlobMapEntry*> BlobMap; |
| - typedef std::map<GURL, std::string> BlobURLMap; |
| - |
| - // Called by BlobDataHandle. |
| + // #### Called by BlobDataHandle #### |
| scoped_ptr<BlobDataSnapshot> CreateSnapshot(const std::string& uuid); |
| + bool IsBeingBuilt(const std::string& uuid) const; |
| + // Returns if construction was successful. |
| + void RunOnConstructionComplete(const std::string& uuid, |
| + const base::Callback<void(bool)>& done); |
| + // ################################## |
|
kinuko
2015/12/13 08:41:45
nit: as was discussed we generally prefer not usin
dmurph
2015/12/18 03:22:50
Done.
|
| // ### Methods called by BlobStorageHost ### |
| - void StartBuildingBlob(const std::string& uuid); |
| - void AppendBlobDataItem(const std::string& uuid, |
| - const DataElement& data_item); |
| - void FinishBuildingBlob(const std::string& uuid, const std::string& type); |
| - void CancelBuildingBlob(const std::string& uuid); |
| + void RegisterBlobUUID(const std::string& uuid); |
| + bool MaybeStartAsyncBlobTransfer(const std::string& uuid); |
| + void FinishAsyncBlobTransfer( |
| + base::Closure done, |
| + base::Callback<void(storage::IPCBlobCreationCancelCode)> cancel, |
| + const storage::BlobDataBuilder& builder); |
| + void CancelAsyncBlobTransfer( |
| + const std::string& uuid, |
| + base::Callback<void(storage::IPCBlobCreationCancelCode)> cancel, |
| + storage::IPCBlobCreationCancelCode code); |
| + bool CleanupCanceledAsyncBlobTransfer(const std::string& uuid); |
| void IncrementBlobRefCount(const std::string& uuid); |
| void DecrementBlobRefCount(const std::string& uuid); |
| // ######################################### |
| // Flags the entry for exceeding memory, and resets the builder. |
| - void BlobEntryExceededMemory(BlobMapEntry* entry); |
| - |
| - // Allocates memory to hold the given data element and copies the data over. |
| - scoped_refptr<BlobDataItem> AllocateBlobItem(const std::string& uuid, |
| - const DataElement& data_item); |
| + void BlobEntryExceededMemory(BlobRegistryEntry* entry); |
| // Appends the given blob item to the blob builder. The new blob |
| // retains ownership of data_item if applicable, and returns false if there |
| @@ -120,6 +117,12 @@ class STORAGE_EXPORT BlobStorageContext |
| scoped_refptr<BlobDataItem> data_item, |
| InternalBlobData::Builder* target_blob_data); |
| + // Allocates a shareable blob data item, with blob references resolved. If |
| + // there isn't enough memory, then a nullptr is returned. |
| + scoped_refptr<ShareableBlobDataItem> AllocateShareableBlobDataItem( |
| + const std::string& target_blob_uuid, |
| + scoped_refptr<BlobDataItem> data_item); |
| + |
| // Deconstructs the blob and appends it's contents to the target blob. Items |
| // are shared if possible, and copied if the given offset and length |
| // have to split an item. |
| @@ -129,12 +132,7 @@ class STORAGE_EXPORT BlobStorageContext |
| uint64_t length, |
| InternalBlobData::Builder* target_blob_data); |
| - bool IsInUse(const std::string& uuid); |
| - bool IsBeingBuilt(const std::string& uuid); |
| - bool IsUrlRegistered(const GURL& blob_url); |
| - |
| - BlobMap blob_map_; |
| - BlobURLMap public_blob_urls_; |
| + BlobStorageRegistry registry_; |
| // Used to keep track of how much memory is being utilized for blob data, |
| // we count only the items of TYPE_DATA which are held in memory and not |