Index: content/child/blob_storage/blob_transport_controller.cc |
diff --git a/content/child/blob_storage/blob_transport_controller.cc b/content/child/blob_storage/blob_transport_controller.cc |
index 1b01792079edee0775759258403c09ecddfb653d..5db46a24726647bcf614777b5eb9322ae038a877 100644 |
--- a/content/child/blob_storage/blob_transport_controller.cc |
+++ b/content/child/blob_storage/blob_transport_controller.cc |
@@ -90,23 +90,27 @@ |
return true; |
} |
-bool WriteSingleRequestToDisk(const BlobConsolidation* consolidation, |
- const BlobItemBytesRequest& request, |
- File* file) { |
+base::Optional<base::Time> WriteSingleRequestToDisk( |
+ const BlobConsolidation* consolidation, |
+ const BlobItemBytesRequest& request, |
+ File* file) { |
if (!file->IsValid()) |
- return false; |
+ return base::nullopt; |
int64_t seek_distance = file->Seek( |
File::FROM_BEGIN, base::checked_cast<int64_t>(request.handle_offset)); |
bool seek_failed = seek_distance < 0; |
UMA_HISTOGRAM_BOOLEAN("Storage.Blob.RendererFileSeekFailed", seek_failed); |
- if (seek_failed) |
- return false; |
+ if (seek_failed) { |
+ return base::nullopt; |
+ } |
BlobConsolidation::ReadStatus status = consolidation->VisitMemory( |
request.renderer_item_index, request.renderer_item_offset, request.size, |
base::Bind(&WriteSingleChunk, file)); |
if (status != BlobConsolidation::ReadStatus::OK) |
- return false; |
- return true; |
+ return base::nullopt; |
+ File::Info info; |
+ file->GetInfo(&info); |
+ return base::make_optional(info.last_modified); |
} |
base::Optional<std::vector<BlobItemBytesResponse>> WriteDiskRequests( |
@@ -114,6 +118,8 @@ |
std::unique_ptr<std::vector<BlobItemBytesRequest>> requests, |
const std::vector<IPC::PlatformFileForTransit>& file_handles) { |
std::vector<BlobItemBytesResponse> responses; |
+ std::vector<base::Time> last_modified_times; |
+ last_modified_times.resize(file_handles.size()); |
// We grab ownership of the file handles here. When this vector is destroyed |
// it will close the files. |
std::vector<File> files; |
@@ -122,24 +128,13 @@ |
files.emplace_back(IPC::PlatformFileForTransitToFile(file_handle)); |
} |
for (const auto& request : *requests) { |
- if (!WriteSingleRequestToDisk(consolidation.get(), request, |
- &files[request.handle_index])) { |
+ base::Optional<base::Time> last_modified = WriteSingleRequestToDisk( |
+ consolidation.get(), request, &files[request.handle_index]); |
+ if (!last_modified) { |
return base::nullopt; |
} |
- } |
- // The last modified time needs to be collected after we flush the file. |
- std::vector<base::Time> last_modified_times; |
- last_modified_times.resize(file_handles.size()); |
- for (size_t i = 0; i < files.size(); ++i) { |
- auto& file = files[i]; |
- if (!file.Flush()) |
- return base::nullopt; |
- File::Info info; |
- if (!file.GetInfo(&info)) |
- return base::nullopt; |
- last_modified_times[i] = info.last_modified; |
- } |
- |
+ last_modified_times[request.handle_index] = last_modified.value(); |
+ } |
for (const auto& request : *requests) { |
responses.push_back(BlobItemBytesResponse(request.request_number)); |
responses.back().time_file_modified = |