Index: storage/browser/blob/blob_async_transport_request_builder.h |
diff --git a/storage/browser/blob/blob_async_transport_strategy.h b/storage/browser/blob/blob_async_transport_request_builder.h |
similarity index 32% |
rename from storage/browser/blob/blob_async_transport_strategy.h |
rename to storage/browser/blob/blob_async_transport_request_builder.h |
index 3e0777182cb1314294f40942ff63304e4545f988..295f9269cc1d67108a135f30d28edc7fd0174150 100644 |
--- a/storage/browser/blob/blob_async_transport_strategy.h |
+++ b/storage/browser/blob/blob_async_transport_request_builder.h |
@@ -2,8 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef STORAGE_BROWSER_BLOB_BLOB_ASYNC_TRANSPORT_STRATEGY_H_ |
-#define STORAGE_BROWSER_BLOB_BLOB_ASYNC_TRANSPORT_STRATEGY_H_ |
+#ifndef STORAGE_BROWSER_BLOB_BLOB_ASYNC_TRANSPORT_REQUEST_BUILDER_H_ |
+#define STORAGE_BROWSER_BLOB_BLOB_ASYNC_TRANSPORT_REQUEST_BUILDER_H_ |
#include <stddef.h> |
#include <stdint.h> |
@@ -20,27 +20,16 @@ |
namespace storage { |
-// This class computes and stores the strategy for asynchronously transporting |
-// memory from the renderer to the browser. We take memory constraints of our |
-// system and the description of a blob, and figure out: |
-// 1) How to store the blob data in the browser process: in memory or on disk. |
-// 2) How to transport the data from the renderer: ipc payload, shared memory, |
-// or file handles. |
-// We then generate data requests for that blob's memory and seed a |
-// BlobDataBuilder for storing that data. |
-// |
+// This class generates the requests needed to asynchronously transport the |
+// given blob items from the renderer to the browser. The main job of this class |
+// is to segment the memory being transfered to efficiently use shared memory, |
+// file, and IPC max sizes. |
// Note: This class does not compute requests by using the 'shortcut' method, |
// where the data is already present in the blob description, and will |
-// always give the caller the full strategy for requesting all data from |
-// the renderer. |
-class STORAGE_EXPORT BlobAsyncTransportStrategy { |
+// always give the caller requests for requesting all data from the |
+// renderer. |
+class STORAGE_EXPORT BlobAsyncTransportRequestBuilder { |
public: |
- enum Error { |
- ERROR_NONE = 0, |
- ERROR_TOO_LARGE, // This item can't fit in disk or memory |
- ERROR_INVALID_PARAMS |
- }; |
- |
struct RendererMemoryItemRequest { |
RendererMemoryItemRequest(); |
// This is the index of the item in the builder on the browser side. |
@@ -51,28 +40,70 @@ class STORAGE_EXPORT BlobAsyncTransportStrategy { |
// the browser. |
size_t browser_item_offset; |
BlobItemBytesRequest message; |
- bool received; |
}; |
- BlobAsyncTransportStrategy(); |
- virtual ~BlobAsyncTransportStrategy(); |
- |
- // This call does the computation to create the requests and builder for the |
- // blob given the memory constraints and blob description. |memory_available| |
- // is the total amount of memory we can offer for storing blobs. |
- // This method can only be called once. |
- void Initialize(size_t max_ipc_memory_size, |
- size_t max_shared_memory_size, |
- size_t max_file_size, |
- uint64_t disk_space_left, |
- size_t memory_available, |
- const std::string& uuid, |
- const std::vector<DataElement>& blob_item_infos); |
- |
- // The sizes of the handles being used (by handle index) in the async |
- // operation. This is used for both files or shared memory, as their use is |
- // mutually exclusive. |
- const std::vector<size_t>& handle_sizes() const { return handle_sizes_; } |
+ BlobAsyncTransportRequestBuilder(); |
+ virtual ~BlobAsyncTransportRequestBuilder(); |
+ |
+ // Initializes the request builder for file requests. One or more files are |
+ // created to hold the given data. Each file can hold data from multiple |
+ // items, and the data from each item can be in multiple files. |
+ // See file_handle_sizes() for the generated file sizes. |
+ // max_file_size: This is the maximum size for a file to back a blob. |
+ // blob_total_size: This is the total in-memory size of the blob. |
+ // elements: These are the descriptions of the blob items being sent from the |
+ // renderer. |
+ // builder: This is the builder that is populated with the 'future' versions |
+ // of the data elements. In this case, we call 'AppendFutureData' in |
+ // the items that we expect to be backed by files writen by the |
+ // renderer. |
+ void InitializeForFileRequests(size_t max_file_size, |
+ uint64_t blob_total_size, |
+ const std::vector<DataElement>& elements, |
+ BlobDataBuilder* builder); |
+ |
+ // Initializes the request builder for shared memory requests. We try to |
+ // consolidate as much memory as possible in each shared memory segment we |
+ // use. |
+ // See shared_memory_handle_sizes() for the shared memory sizes. |
+ // max_shared_memory_size: This is the maximum size for a shared memory |
+ // segment used to transport the data between renderer |
+ // and browser. |
+ // blob_total_size: This is the total in-memory size of the blob. |
+ // elements: These are the descriptions of the blob items being sent from the |
+ // renderer. |
+ // builder: This is the builder that is populated with the 'future' versions |
+ // of the data elements. In this case, we call 'AppendFutureData' for |
+ // the items we expect to be populated later. |
+ void InitializeForSharedMemoryRequests( |
+ size_t max_shared_memory_size, |
+ uint64_t blob_total_size, |
+ const std::vector<DataElement>& elements, |
+ BlobDataBuilder* builder); |
+ |
+ // Initializes the request builder for IPC requests. We put as much memory |
+ // in a single IPC request as possible. |
+ // max_ipc_memory_size: This is the maximum size for an IPC message which will |
+ // be used to transport memory from the renderer to the |
+ // browser. |
+ // blob_total_size: This is the total in-memory size of the blob. |
+ // elements: These are the descriptions of the blob items being sent from the |
+ // renderer. |
+ // builder: This is the builder that is populated with the 'future' versions |
+ // of the data elements. In this case, we call 'AppendFutureData' for |
+ // the items we expect to be populated later. |
+ void InitializeForIPCRequests(size_t max_ipc_memory_size, |
+ uint64_t blob_total_size, |
+ const std::vector<DataElement>& elements, |
+ BlobDataBuilder* builder); |
+ |
+ // The sizes of the shared memory handles being used (by handle index). |
+ const std::vector<size_t>& shared_memory_sizes() const { |
+ return shared_memory_sizes_; |
+ } |
+ |
+ // The sizes of the file handles being used (by handle index). |
+ const std::vector<size_t>& file_sizes() const { return file_sizes_; } |
// The requests for memory, segmented as described above, along with their |
// destination browser indexes and offsets. |
@@ -80,25 +111,9 @@ class STORAGE_EXPORT BlobAsyncTransportStrategy { |
return requests_; |
} |
- // Marks the request at the given request number as recieved. |
- void MarkRequestAsReceived(size_t request_num) { |
- DCHECK_LT(request_num, requests_.size()); |
- requests_[request_num].received = true; |
- } |
- |
- // A BlobDataBuilder which can be used to construct the Blob in the |
- // BlobStorageContext object after: |
- // * The bytes items from AppendFutureData are populated by |
- // PopulateFutureData. |
- // * The temporary files from AppendFutureFile are populated by |
- // PopulateFutureFile. |
- BlobDataBuilder* blob_builder() { return builder_.get(); } |
- |
// The total bytes size of memory items in the blob. |
uint64_t total_bytes_size() const { return total_bytes_size_; } |
- Error error() const { return error_; } |
- |
static bool ShouldBeShortcut(const std::vector<DataElement>& items, |
size_t memory_available); |
@@ -107,20 +122,17 @@ class STORAGE_EXPORT BlobAsyncTransportStrategy { |
size_t max_segment_size, |
std::vector<size_t>* segment_sizes); |
- Error error_; |
- |
- // We use the same vector for shared memory handle sizes and file handle sizes |
- // because we only use one for any strategy. The size of the handles is capped |
- // by the |max_file_size| argument in Initialize, so we can just use size_t. |
- std::vector<size_t> handle_sizes_; |
+ std::vector<size_t> shared_memory_sizes_; |
+ // The size of the files is capped by the |max_file_size| argument in |
+ // InitializeForFileRequests, so we can just use size_t. |
+ std::vector<size_t> file_sizes_; |
uint64_t total_bytes_size_; |
std::vector<RendererMemoryItemRequest> requests_; |
- scoped_ptr<BlobDataBuilder> builder_; |
- DISALLOW_COPY_AND_ASSIGN(BlobAsyncTransportStrategy); |
+ DISALLOW_COPY_AND_ASSIGN(BlobAsyncTransportRequestBuilder); |
}; |
} // namespace storage |
-#endif // STORAGE_BROWSER_BLOB_BLOB_ASYNC_TRANSPORT_STRATEGY_H_ |
+#endif // STORAGE_BROWSER_BLOB_BLOB_ASYNC_TRANSPORT_REQUEST_BUILDER_H_ |