OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #include "base/numerics/safe_math.h" | 10 #include "base/numerics/safe_math.h" |
| 11 #include "base/strings/string_number_conversions.h" |
11 #include "storage/browser/blob/blob_async_transport_request_builder.h" | 12 #include "storage/browser/blob/blob_async_transport_request_builder.h" |
12 #include "storage/common/blob_storage/blob_storage_constants.h" | 13 #include "storage/common/blob_storage/blob_storage_constants.h" |
13 | 14 |
14 namespace storage { | 15 namespace storage { |
15 namespace { | 16 namespace { |
16 bool IsBytes(DataElement::Type type) { | 17 bool IsBytes(DataElement::Type type) { |
17 return type == DataElement::TYPE_BYTES || | 18 return type == DataElement::TYPE_BYTES || |
18 type == DataElement::TYPE_BYTES_DESCRIPTION; | 19 type == DataElement::TYPE_BYTES_DESCRIPTION; |
19 } | 20 } |
20 | 21 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 request.browser_item_offset = 0; | 55 request.browser_item_offset = 0; |
55 request.message.request_number = requests->size(); | 56 request.message.request_number = requests->size(); |
56 request.message.transport_strategy = IPCBlobItemRequestStrategy::FILE; | 57 request.message.transport_strategy = IPCBlobItemRequestStrategy::FILE; |
57 request.message.renderer_item_index = element_index; | 58 request.message.renderer_item_index = element_index; |
58 request.message.renderer_item_offset = element_offset; | 59 request.message.renderer_item_offset = element_offset; |
59 request.message.size = size; | 60 request.message.size = size; |
60 request.message.handle_index = segment_index; | 61 request.message.handle_index = segment_index; |
61 request.message.handle_offset = segment_offset; | 62 request.message.handle_offset = segment_offset; |
62 | 63 |
63 requests->push_back(request); | 64 requests->push_back(request); |
64 builder->AppendFutureFile(segment_offset, size); | 65 builder->AppendFutureFile(segment_offset, size, |
| 66 base::SizeTToString(segment_index)); |
65 current_item_index++; | 67 current_item_index++; |
66 } | 68 } |
67 | 69 |
68 void VisitNonBytesSegment(const DataElement& element, size_t element_index) { | 70 void VisitNonBytesSegment(const DataElement& element, size_t element_index) { |
69 builder->AppendIPCDataElement(element); | 71 builder->AppendIPCDataElement(element); |
70 current_item_index++; | 72 current_item_index++; |
71 } | 73 } |
72 | 74 |
73 void Done() {} | 75 void Done() {} |
74 | 76 |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 request.message.transport_strategy = IPCBlobItemRequestStrategy::IPC; | 256 request.message.transport_strategy = IPCBlobItemRequestStrategy::IPC; |
255 request.message.renderer_item_index = i; | 257 request.message.renderer_item_index = i; |
256 request.message.renderer_item_offset = 0; | 258 request.message.renderer_item_offset = 0; |
257 request.message.size = info.length(); | 259 request.message.size = info.length(); |
258 requests_.push_back(request); | 260 requests_.push_back(request); |
259 builder->AppendFutureData(info.length()); | 261 builder->AppendFutureData(info.length()); |
260 } | 262 } |
261 } | 263 } |
262 | 264 |
263 /* static */ | 265 /* static */ |
264 bool BlobAsyncTransportRequestBuilder::ShouldBeShortcut( | |
265 const std::vector<DataElement>& elements, | |
266 size_t memory_available) { | |
267 base::CheckedNumeric<size_t> shortcut_bytes = 0; | |
268 for (const auto& element : elements) { | |
269 DataElement::Type type = element.type(); | |
270 if (type == DataElement::TYPE_BYTES_DESCRIPTION) { | |
271 return false; | |
272 } | |
273 if (type == DataElement::TYPE_BYTES) { | |
274 shortcut_bytes += element.length(); | |
275 if (!shortcut_bytes.IsValid()) { | |
276 return false; | |
277 } | |
278 } | |
279 } | |
280 return shortcut_bytes.ValueOrDie() <= memory_available; | |
281 } | |
282 | |
283 /* static */ | |
284 void BlobAsyncTransportRequestBuilder::ComputeHandleSizes( | 266 void BlobAsyncTransportRequestBuilder::ComputeHandleSizes( |
285 uint64_t total_memory_size, | 267 uint64_t total_memory_size, |
286 size_t max_segment_size, | 268 size_t max_segment_size, |
287 std::vector<size_t>* segment_sizes) { | 269 std::vector<size_t>* segment_sizes) { |
288 size_t total_max_segments = | 270 size_t total_max_segments = |
289 static_cast<size_t>(total_memory_size / max_segment_size); | 271 static_cast<size_t>(total_memory_size / max_segment_size); |
290 bool has_extra_segment = (total_memory_size % max_segment_size) > 0; | 272 bool has_extra_segment = (total_memory_size % max_segment_size) > 0; |
291 segment_sizes->reserve(total_max_segments + (has_extra_segment ? 1 : 0)); | 273 segment_sizes->reserve(total_max_segments + (has_extra_segment ? 1 : 0)); |
292 segment_sizes->insert(segment_sizes->begin(), total_max_segments, | 274 segment_sizes->insert(segment_sizes->begin(), total_max_segments, |
293 max_segment_size); | 275 max_segment_size); |
294 if (has_extra_segment) { | 276 if (has_extra_segment) { |
295 segment_sizes->push_back(total_memory_size % max_segment_size); | 277 segment_sizes->push_back(total_memory_size % max_segment_size); |
296 } | 278 } |
297 } | 279 } |
298 | 280 |
299 } // namespace storage | 281 } // namespace storage |
OLD | NEW |