Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: content/child/blob_storage/blob_transport_controller.cc

Issue 2516713002: [BlobStorage] Implementing disk. (Closed)
Patch Set: removed cleanup check, as mac doesn't run out event loops Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/blob_storage/chrome_blob_storage_context.cc ('k') | content/test/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "content/child/blob_storage/blob_transport_controller.h" 5 #include "content/child/blob_storage/blob_transport_controller.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 file->WriteAtCurrentPos(memory, static_cast<int>(writing_size)); 83 file->WriteAtCurrentPos(memory, static_cast<int>(writing_size));
84 bool write_failed = actual_written < 0; 84 bool write_failed = actual_written < 0;
85 UMA_HISTOGRAM_BOOLEAN("Storage.Blob.RendererFileWriteFailed", write_failed); 85 UMA_HISTOGRAM_BOOLEAN("Storage.Blob.RendererFileWriteFailed", write_failed);
86 if (write_failed) 86 if (write_failed)
87 return false; 87 return false;
88 written += actual_written; 88 written += actual_written;
89 } 89 }
90 return true; 90 return true;
91 } 91 }
92 92
93 base::Optional<base::Time> WriteSingleRequestToDisk( 93 bool WriteSingleRequestToDisk(const BlobConsolidation* consolidation,
94 const BlobConsolidation* consolidation, 94 const BlobItemBytesRequest& request,
95 const BlobItemBytesRequest& request, 95 File* file) {
96 File* file) {
97 if (!file->IsValid()) 96 if (!file->IsValid())
98 return base::nullopt; 97 return false;
99 int64_t seek_distance = file->Seek( 98 int64_t seek_distance = file->Seek(
100 File::FROM_BEGIN, base::checked_cast<int64_t>(request.handle_offset)); 99 File::FROM_BEGIN, base::checked_cast<int64_t>(request.handle_offset));
101 bool seek_failed = seek_distance < 0; 100 bool seek_failed = seek_distance < 0;
102 UMA_HISTOGRAM_BOOLEAN("Storage.Blob.RendererFileSeekFailed", seek_failed); 101 UMA_HISTOGRAM_BOOLEAN("Storage.Blob.RendererFileSeekFailed", seek_failed);
103 if (seek_failed) { 102 if (seek_failed)
104 return base::nullopt; 103 return false;
105 }
106 BlobConsolidation::ReadStatus status = consolidation->VisitMemory( 104 BlobConsolidation::ReadStatus status = consolidation->VisitMemory(
107 request.renderer_item_index, request.renderer_item_offset, request.size, 105 request.renderer_item_index, request.renderer_item_offset, request.size,
108 base::Bind(&WriteSingleChunk, file)); 106 base::Bind(&WriteSingleChunk, file));
109 if (status != BlobConsolidation::ReadStatus::OK) 107 if (status != BlobConsolidation::ReadStatus::OK)
110 return base::nullopt; 108 return false;
111 File::Info info; 109 return true;
112 file->GetInfo(&info);
113 return base::make_optional(info.last_modified);
114 } 110 }
115 111
116 base::Optional<std::vector<BlobItemBytesResponse>> WriteDiskRequests( 112 base::Optional<std::vector<BlobItemBytesResponse>> WriteDiskRequests(
117 scoped_refptr<BlobConsolidation> consolidation, 113 scoped_refptr<BlobConsolidation> consolidation,
118 std::unique_ptr<std::vector<BlobItemBytesRequest>> requests, 114 std::unique_ptr<std::vector<BlobItemBytesRequest>> requests,
119 const std::vector<IPC::PlatformFileForTransit>& file_handles) { 115 const std::vector<IPC::PlatformFileForTransit>& file_handles) {
120 std::vector<BlobItemBytesResponse> responses; 116 std::vector<BlobItemBytesResponse> responses;
121 std::vector<base::Time> last_modified_times;
122 last_modified_times.resize(file_handles.size());
123 // We grab ownership of the file handles here. When this vector is destroyed 117 // We grab ownership of the file handles here. When this vector is destroyed
124 // it will close the files. 118 // it will close the files.
125 std::vector<File> files; 119 std::vector<File> files;
126 files.reserve(file_handles.size()); 120 files.reserve(file_handles.size());
127 for (const auto& file_handle : file_handles) { 121 for (const auto& file_handle : file_handles) {
128 files.emplace_back(IPC::PlatformFileForTransitToFile(file_handle)); 122 files.emplace_back(IPC::PlatformFileForTransitToFile(file_handle));
129 } 123 }
130 for (const auto& request : *requests) { 124 for (const auto& request : *requests) {
131 base::Optional<base::Time> last_modified = WriteSingleRequestToDisk( 125 if (!WriteSingleRequestToDisk(consolidation.get(), request,
132 consolidation.get(), request, &files[request.handle_index]); 126 &files[request.handle_index])) {
133 if (!last_modified) {
134 return base::nullopt; 127 return base::nullopt;
135 } 128 }
136 last_modified_times[request.handle_index] = last_modified.value();
137 } 129 }
130 // The last modified time needs to be collected after we flush the file.
131 std::vector<base::Time> last_modified_times;
132 last_modified_times.resize(file_handles.size());
133 for (size_t i = 0; i < files.size(); ++i) {
134 auto& file = files[i];
135 if (!file.Flush())
136 return base::nullopt;
137 File::Info info;
138 if (!file.GetInfo(&info))
139 return base::nullopt;
140 last_modified_times[i] = info.last_modified;
141 }
142
138 for (const auto& request : *requests) { 143 for (const auto& request : *requests) {
139 responses.push_back(BlobItemBytesResponse(request.request_number)); 144 responses.push_back(BlobItemBytesResponse(request.request_number));
140 responses.back().time_file_modified = 145 responses.back().time_file_modified =
141 last_modified_times[request.handle_index]; 146 last_modified_times[request.handle_index];
142 } 147 }
143 148
144 return responses; 149 return responses;
145 } 150 }
146 151
147 } // namespace 152 } // namespace
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 406
402 void BlobTransportController::ReleaseBlobConsolidation( 407 void BlobTransportController::ReleaseBlobConsolidation(
403 const std::string& uuid) { 408 const std::string& uuid) {
404 if (blob_storage_.erase(uuid)) { 409 if (blob_storage_.erase(uuid)) {
405 main_thread_runner_->PostTask(FROM_HERE, 410 main_thread_runner_->PostTask(FROM_HERE,
406 base::Bind(&DecChildProcessRefCount)); 411 base::Bind(&DecChildProcessRefCount));
407 } 412 }
408 } 413 }
409 414
410 } // namespace content 415 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/blob_storage/chrome_blob_storage_context.cc ('k') | content/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698