Index: content/common/mojo/embedded_application_runner.cc |
diff --git a/content/common/mojo/embedded_application_runner.cc b/content/common/mojo/embedded_application_runner.cc |
deleted file mode 100644 |
index 4f4ecff7746ce6fc1f636e45fddb5c7d5344620e..0000000000000000000000000000000000000000 |
--- a/content/common/mojo/embedded_application_runner.cc |
+++ /dev/null |
@@ -1,177 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/common/mojo/embedded_application_runner.h" |
- |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/threading/thread.h" |
-#include "base/threading/thread_checker.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "services/shell/public/cpp/service_context.h" |
- |
-namespace content { |
- |
-class EmbeddedApplicationRunner::Instance |
- : public base::RefCountedThreadSafe<Instance> { |
- public: |
- Instance(const base::StringPiece& name, |
- const MojoApplicationInfo& info, |
- const base::Closure& quit_closure) |
- : name_(name.as_string()), |
- factory_callback_(info.application_factory), |
- use_own_thread_(!info.application_task_runner && info.use_own_thread), |
- quit_closure_(quit_closure), |
- quit_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
- application_task_runner_(info.application_task_runner) { |
- if (!use_own_thread_ && !application_task_runner_) |
- application_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
- } |
- |
- void BindServiceRequest(shell::mojom::ServiceRequest request) { |
- DCHECK(runner_thread_checker_.CalledOnValidThread()); |
- |
- if (use_own_thread_ && !thread_) { |
- // Start a new thread if necessary. |
- thread_.reset(new base::Thread(name_)); |
- thread_->Start(); |
- application_task_runner_ = thread_->task_runner(); |
- } |
- |
- DCHECK(application_task_runner_); |
- application_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&Instance::BindServiceRequestOnApplicationThread, this, |
- base::Passed(&request))); |
- } |
- |
- void ShutDown() { |
- DCHECK(runner_thread_checker_.CalledOnValidThread()); |
- if (!application_task_runner_) |
- return; |
- // Any extant ServiceContexts must be destroyed on the application thread. |
- if (application_task_runner_->BelongsToCurrentThread()) { |
- Quit(); |
- } else { |
- application_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&Instance::Quit, this)); |
- } |
- } |
- |
- private: |
- friend class base::RefCountedThreadSafe<Instance>; |
- |
- ~Instance() { |
- // If this instance had its own thread, it MUST be explicitly destroyed by |
- // QuitOnRunnerThread() by the time this destructor is run. |
- DCHECK(!thread_); |
- } |
- |
- void BindServiceRequestOnApplicationThread( |
- shell::mojom::ServiceRequest request) { |
- DCHECK(application_task_runner_->BelongsToCurrentThread()); |
- |
- if (!service_) { |
- service_ = factory_callback_.Run( |
- base::Bind(&Instance::Quit, base::Unretained(this))); |
- } |
- |
- shell::ServiceContext* new_connection = |
- new shell::ServiceContext(service_.get(), std::move(request)); |
- shell_connections_.push_back(base::WrapUnique(new_connection)); |
- new_connection->SetConnectionLostClosure( |
- base::Bind(&Instance::OnStop, base::Unretained(this), |
- new_connection)); |
- } |
- |
- void OnStop(shell::ServiceContext* connection) { |
- DCHECK(application_task_runner_->BelongsToCurrentThread()); |
- |
- for (auto it = shell_connections_.begin(); it != shell_connections_.end(); |
- ++it) { |
- if (it->get() == connection) { |
- shell_connections_.erase(it); |
- break; |
- } |
- } |
- } |
- |
- void Quit() { |
- DCHECK(application_task_runner_->BelongsToCurrentThread()); |
- |
- shell_connections_.clear(); |
- service_.reset(); |
- if (quit_task_runner_->BelongsToCurrentThread()) { |
- QuitOnRunnerThread(); |
- } else { |
- quit_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&Instance::QuitOnRunnerThread, this)); |
- } |
- } |
- |
- void QuitOnRunnerThread() { |
- DCHECK(runner_thread_checker_.CalledOnValidThread()); |
- if (thread_) { |
- thread_.reset(); |
- application_task_runner_ = nullptr; |
- } |
- quit_closure_.Run(); |
- } |
- |
- const std::string name_; |
- const MojoApplicationInfo::ApplicationFactory factory_callback_; |
- const bool use_own_thread_; |
- const base::Closure quit_closure_; |
- const scoped_refptr<base::SingleThreadTaskRunner> quit_task_runner_; |
- |
- // Thread checker used to ensure certain operations happen only on the |
- // runner's (i.e. our owner's) thread. |
- base::ThreadChecker runner_thread_checker_; |
- |
- // These fields must only be accessed from the runner's thread. |
- std::unique_ptr<base::Thread> thread_; |
- scoped_refptr<base::SingleThreadTaskRunner> application_task_runner_; |
- |
- // These fields must only be accessed from the application thread, except in |
- // the destructor which may run on either the runner thread or the application |
- // thread. |
- std::unique_ptr<shell::Service> service_; |
- std::vector<std::unique_ptr<shell::ServiceContext>> shell_connections_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Instance); |
-}; |
- |
-EmbeddedApplicationRunner::EmbeddedApplicationRunner( |
- const base::StringPiece& name, |
- const MojoApplicationInfo& info) |
- : weak_factory_(this) { |
- instance_ = new Instance(name, info, |
- base::Bind(&EmbeddedApplicationRunner::OnQuit, |
- weak_factory_.GetWeakPtr())); |
-} |
- |
-EmbeddedApplicationRunner::~EmbeddedApplicationRunner() { |
- instance_->ShutDown(); |
-} |
- |
-void EmbeddedApplicationRunner::BindServiceRequest( |
- shell::mojom::ServiceRequest request) { |
- instance_->BindServiceRequest(std::move(request)); |
-} |
- |
-void EmbeddedApplicationRunner::SetQuitClosure( |
- const base::Closure& quit_closure) { |
- quit_closure_ = quit_closure; |
-} |
- |
-void EmbeddedApplicationRunner::OnQuit() { |
- if (!quit_closure_.is_null()) |
- quit_closure_.Run(); |
-} |
- |
-} // namespace content |