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

Unified Diff: content/child/blob_storage/blob_transport_controller.cc

Issue 1234813004: [BlobAsync] Asynchronous Blob Construction Final Patch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@blob-protocol-change
Patch Set: comments Created 4 years, 9 months 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 side-by-side diff with in-line comments
Download patch
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 cfd2c05df12e6a41eef348ca89c18d9ac05ab09e..c2b639ad921d66879b031117191d1fa01bad0db0 100644
--- a/content/child/blob_storage/blob_transport_controller.cc
+++ b/content/child/blob_storage/blob_transport_controller.cc
@@ -10,9 +10,12 @@
#include "base/lazy_instance.h"
#include "base/memory/scoped_vector.h"
#include "base/memory/shared_memory.h"
+#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "content/child/blob_storage/blob_consolidation.h"
+#include "content/child/child_process.h"
#include "content/child/thread_safe_sender.h"
+#include "content/common/fileapi/webblob_messages.h"
#include "ipc/ipc_sender.h"
#include "storage/common/blob_storage/blob_item_bytes_request.h"
#include "storage/common/blob_storage/blob_item_bytes_response.h"
@@ -36,6 +39,15 @@ namespace {
const size_t kLargeThresholdBytes = 250 * 1024;
static base::LazyInstance<BlobTransportController> g_controller =
LAZY_INSTANCE_INITIALIZER;
+
+// This keeps the process alive while blobs are being transferred.
kinuko 2016/03/15 15:29:07 Ooh, I see interesting.
+void IncChildProcessRefCount() {
+ ChildProcess::current()->AddRefProcess();
+}
+
+void DecChildProcessRefCount() {
+ ChildProcess::current()->ReleaseProcess();
+}
} // namespace
BlobTransportController* BlobTransportController::GetInstance() {
@@ -46,16 +58,19 @@ BlobTransportController::~BlobTransportController() {}
void BlobTransportController::InitiateBlobTransfer(
const std::string& uuid,
- const std::string& type,
scoped_ptr<BlobConsolidation> consolidation,
- IPC::Sender* sender) {
+ IPC::Sender* sender,
+ scoped_refptr<base::SingleThreadTaskRunner> main_runner) {
BlobConsolidation* consolidation_ptr = consolidation.get();
- blob_storage_.insert(std::make_pair(uuid, std::move(consolidation)));
+ if (blob_storage_.empty()) {
+ main_thread_runner_ = std::move(main_runner);
+ main_thread_runner_->PostTask(FROM_HERE,
+ base::Bind(&IncChildProcessRefCount));
+ }
+ blob_storage_[uuid] = std::move(consolidation);
std::vector<storage::DataElement> descriptions;
GetDescriptions(consolidation_ptr, kLargeThresholdBytes, &descriptions);
- // TODO(dmurph): Uncomment when IPC messages are added.
- // sender->Send(new BlobStorageMsg_StartBuildingBlob(uuid, type,
- // descriptions));
+ sender->Send(new BlobStorageMsg_StartBuildingBlob(uuid, descriptions));
}
void BlobTransportController::OnMemoryRequest(
@@ -85,25 +100,14 @@ void BlobTransportController::OnMemoryRequest(
break;
}
- // TODO(dmurph): Uncomment when IPC messages are added.
- // sender->Send(new BlobStorageMsg_MemoryItemResponse(uuid, responses));
+ sender->Send(new BlobStorageMsg_MemoryItemResponse(uuid, responses));
}
void BlobTransportController::OnCancel(
const std::string& uuid,
storage::IPCBlobCreationCancelCode code) {
- DVLOG(1) << "Received blob cancel for blob " << uuid << " with reason:";
- switch (code) {
- case IPCBlobCreationCancelCode::UNKNOWN:
- DVLOG(1) << "Unknown.";
- break;
- case IPCBlobCreationCancelCode::OUT_OF_MEMORY:
- DVLOG(1) << "Out of Memory.";
- break;
- case IPCBlobCreationCancelCode::FILE_WRITE_FAILED:
- DVLOG(1) << "File Write Failed (Invalid cancel reason!).";
- break;
- }
+ DVLOG(1) << "Received blob cancel for blob " << uuid
+ << " with code: " << static_cast<int>(code);
ReleaseBlobConsolidation(uuid);
}
@@ -111,20 +115,16 @@ void BlobTransportController::OnDone(const std::string& uuid) {
ReleaseBlobConsolidation(uuid);
}
-void BlobTransportController::Clear() {
+void BlobTransportController::ClearForTesting() {
+ if (!blob_storage_.empty() && main_thread_runner_) {
+ main_thread_runner_->PostTask(FROM_HERE,
+ base::Bind(&DecChildProcessRefCount));
+ }
blob_storage_.clear();
}
BlobTransportController::BlobTransportController() {}
-void BlobTransportController::CancelBlobTransfer(const std::string& uuid,
- IPCBlobCreationCancelCode code,
- IPC::Sender* sender) {
- // TODO(dmurph): Uncomment when IPC messages are added.
- // sender->Send(new BlobStorageMsg_CancelBuildingBlob(uuid, code));
- ReleaseBlobConsolidation(uuid);
-}
-
void BlobTransportController::GetDescriptions(
BlobConsolidation* consolidation,
size_t max_data_population,
@@ -255,7 +255,13 @@ BlobTransportController::ResponsesStatus BlobTransportController::GetResponses(
void BlobTransportController::ReleaseBlobConsolidation(
const std::string& uuid) {
- blob_storage_.erase(uuid);
+ // If we erased something and we're now empty, release the child process
+ // ref count and deref the main thread runner.
+ if (blob_storage_.erase(uuid) && blob_storage_.empty()) {
+ main_thread_runner_->PostTask(FROM_HERE,
+ base::Bind(&DecChildProcessRefCount));
+ main_thread_runner_ = nullptr;
+ }
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698