| Index: blimp/engine/mojo/blob_channel_service.cc
|
| diff --git a/blimp/engine/mojo/blob_channel_service.cc b/blimp/engine/mojo/blob_channel_service.cc
|
| index c6dab89c76000bf1a2b22d07fb163d58f01df43e..d3b93f70de125aeed64a460667c97e82f82cfed9 100644
|
| --- a/blimp/engine/mojo/blob_channel_service.cc
|
| +++ b/blimp/engine/mojo/blob_channel_service.cc
|
| @@ -10,24 +10,57 @@
|
| #include <vector>
|
|
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/task_runner_util.h"
|
| +#include "base/threading/thread.h"
|
| #include "blimp/net/blob_channel/blob_channel_sender.h"
|
| #include "mojo/public/cpp/system/buffer.h"
|
|
|
| namespace blimp {
|
| namespace engine {
|
| +namespace {
|
|
|
| -BlobChannelService::BlobChannelService(BlobChannelSender* blob_channel_sender)
|
| - : blob_channel_sender_(blob_channel_sender) {
|
| - DCHECK(blob_channel_sender_);
|
| +std::vector<BlobChannelSender::CacheStateEntry>
|
| +GetCachedBlobIdsFromWeakPtr(base::WeakPtr<BlobChannelSender> sender) {
|
| + if (sender) {
|
| + return sender->GetCachedBlobIds();
|
| + } else {
|
| + return std::vector<BlobChannelSender::CacheStateEntry>();
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +BlobChannelService::BlobChannelService(
|
| + base::WeakPtr<BlobChannelSender> blob_channel_sender,
|
| + scoped_refptr<base::SingleThreadTaskRunner> blob_sender_task_runner)
|
| + : blob_channel_sender_(blob_channel_sender),
|
| + blob_sender_task_runner_(blob_sender_task_runner),
|
| + weak_factory_(this) {
|
| + DCHECK(blob_sender_task_runner_.get());
|
| }
|
|
|
| -BlobChannelService::~BlobChannelService() {}
|
| +BlobChannelService::~BlobChannelService() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +}
|
|
|
| void BlobChannelService::GetCachedBlobIds(
|
| const BlobChannelService::GetCachedBlobIdsCallback& response_callback) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| VLOG(1) << "BlobChannel::GetCachedBlobIds called.";
|
| +
|
| + // Pull the list of blob IDs from the UI thread.
|
| + base::PostTaskAndReplyWithResult(
|
| + blob_sender_task_runner_.get(), FROM_HERE,
|
| + base::Bind(&GetCachedBlobIdsFromWeakPtr, blob_channel_sender_),
|
| + base::Bind(&BlobChannelService::OnGetCachedBlobsCompleted,
|
| + weak_factory_.GetWeakPtr(), response_callback));
|
| +}
|
| +
|
| +void BlobChannelService::OnGetCachedBlobsCompleted(
|
| + const BlobChannelService::GetCachedBlobIdsCallback& response_callback,
|
| + const std::vector<BlobChannelSender::CacheStateEntry>& ids) {
|
| std::unordered_map<std::string, bool> cache_state;
|
| - for (const auto& next_entry : blob_channel_sender_->GetCachedBlobIds()) {
|
| + for (const auto& next_entry : ids) {
|
| cache_state[next_entry.id] = next_entry.was_delivered;
|
| }
|
| response_callback.Run(std::move(cache_state));
|
| @@ -36,6 +69,8 @@ void BlobChannelService::GetCachedBlobIds(
|
| void BlobChannelService::PutBlob(const std::string& id,
|
| mojo::ScopedSharedBufferHandle data,
|
| uint32_t size) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| // Map |data| into the address space and copy out its contents.
|
| if (!data.is_valid()) {
|
| LOG(ERROR) << "Invalid data handle received from renderer process.";
|
| @@ -52,15 +87,27 @@ void BlobChannelService::PutBlob(const std::string& id,
|
|
|
| scoped_refptr<BlobData> new_blob(new BlobData);
|
| new_blob->data.assign(reinterpret_cast<const char*>(mapping.get()), size);
|
| - blob_channel_sender_->PutBlob(id, std::move(new_blob));
|
| +
|
| + blob_sender_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&BlobChannelSender::PutBlob,
|
| + blob_channel_sender_,
|
| + id,
|
| + base::Passed(std::move(new_blob))));
|
| }
|
|
|
| void BlobChannelService::DeliverBlob(const std::string& id) {
|
| - blob_channel_sender_->DeliverBlob(id);
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + blob_sender_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&BlobChannelSender::DeliverBlob,
|
| + blob_channel_sender_,
|
| + id));
|
| }
|
|
|
| void BlobChannelService::BindRequest(
|
| mojo::InterfaceRequest<mojom::BlobChannel> request) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| bindings_.AddBinding(this, std::move(request));
|
| }
|
|
|
|
|