Index: mandoline/services/core_services/core_services_application_delegate.cc |
diff --git a/mandoline/services/core_services/core_services_application_delegate.cc b/mandoline/services/core_services/core_services_application_delegate.cc |
index c1ca1507de95964a876edb148c0f8384eb7aa624..3867c55ea08108f72d97ee1af9a5a3697ee52c3f 100644 |
--- a/mandoline/services/core_services/core_services_application_delegate.cc |
+++ b/mandoline/services/core_services/core_services_application_delegate.cc |
@@ -6,6 +6,7 @@ |
#include "base/bind.h" |
#include "base/single_thread_task_runner.h" |
+#include "base/threading/simple_thread.h" |
#include "components/clipboard/clipboard_application_delegate.h" |
#include "components/filesystem/file_system_app.h" |
#include "components/resource_provider/resource_provider_app.h" |
@@ -14,6 +15,7 @@ |
#include "mandoline/ui/browser/browser.h" |
#include "mojo/application/public/cpp/application_connection.h" |
#include "mojo/application/public/cpp/application_impl.h" |
+#include "mojo/application/public/cpp/application_runner.h" |
#include "mojo/common/message_pump_mojo.h" |
#include "mojo/services/network/network_service_delegate.h" |
#include "mojo/services/tracing/tracing_app.h" |
@@ -25,85 +27,51 @@ |
namespace core_services { |
-class ApplicationThread; |
- |
-// A base::Thread which hosts a mojo::ApplicationImpl on its own thread. |
-// |
-// Why not base::SimpleThread? The comments in SimpleThread discourage its use, |
-// and we want most of what base::Thread provides. The hack where we call |
-// SetThreadWasQuitProperly() in Run() is already used in the chrome codebase. |
-// (By the time we building a base::Thread here, we already have a MessageLoop |
-// on our thread, along with a lot of other bookkeeping objects, too. This is |
-// why we don't call into ApplicationRunner; we already have an AtExitManager et |
-// all at this point.) |
-class ApplicationThread : public base::Thread { |
+// A helper class for hosting a mojo::ApplicationImpl on its own thread. |
+class ApplicationThread : public base::SimpleThread { |
public: |
ApplicationThread( |
const base::WeakPtr<CoreServicesApplicationDelegate> |
core_services_application, |
- const std::string& name, |
+ const std::string& url, |
scoped_ptr<mojo::ApplicationDelegate> delegate, |
mojo::InterfaceRequest<mojo::Application> request) |
- : base::Thread(name), |
+ : base::SimpleThread(url), |
core_services_application_(core_services_application), |
core_services_application_task_runner_( |
base::MessageLoop::current()->task_runner()), |
+ url_(url), |
delegate_(delegate.Pass()), |
request_(request.Pass()) { |
} |
~ApplicationThread() override { |
- Stop(); |
+ Join(); |
} |
- // Overridden from base::Thread: |
- void Run(base::MessageLoop* message_loop) override { |
- { |
- application_impl_.reset(new mojo::ApplicationImpl( |
- delegate_.get(), request_.Pass())); |
- base::Thread::Run(message_loop); |
- application_impl_.reset(); |
+ // Overridden from base::SimpleThread: |
+ void Run() override { |
+ scoped_ptr<mojo::ApplicationRunner> runner( |
+ new mojo::ApplicationRunner(delegate_.release())); |
+ if (url_ == "mojo://network_service/") { |
+ runner->set_message_loop_type(base::MessageLoop::TYPE_IO); |
+ } else if (url_ == "mojo://view_manager/") { |
+ runner->set_message_loop_type(base::MessageLoop::TYPE_UI); |
} |
- delegate_.reset(); |
+ runner->Run(request_.PassMessagePipe().release().value(), false); |
core_services_application_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&CoreServicesApplicationDelegate::ApplicationThreadDestroyed, |
core_services_application_, |
this)); |
- |
- // TODO(erg): This is a hack. |
- // |
- // Right now, most of our services do not receive |
- // Application::RequestQuit() calls. jam@ is currently working on shutting |
- // down everything cleanly. In the long run, we don't wan this here (we |
- // want this set in ShutdownCleanly()), but until we can rely on |
- // RequestQuit() getting delivered we have to manually do this here. |
- // |
- // Remove this ASAP. |
- Thread::SetThreadWasQuitProperly(true); |
- } |
- |
- void RequestQuit() { |
- if (!IsRunning()) |
- return; |
- task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&ApplicationThread::ShutdownCleanly, |
- base::Unretained(this))); |
- |
- } |
- |
- void ShutdownCleanly() { |
- application_impl_->QuitNow(); |
- Thread::SetThreadWasQuitProperly(true); |
} |
private: |
base::WeakPtr<CoreServicesApplicationDelegate> core_services_application_; |
scoped_refptr<base::SingleThreadTaskRunner> |
core_services_application_task_runner_; |
- scoped_ptr<mojo::ApplicationImpl> application_impl_; |
+ std::string url_; |
scoped_ptr<mojo::ApplicationDelegate> delegate_; |
mojo::InterfaceRequest<mojo::Application> request_; |
@@ -135,11 +103,6 @@ bool CoreServicesApplicationDelegate::ConfigureIncomingConnection( |
} |
void CoreServicesApplicationDelegate::Quit() { |
- // Fire off RequestQuit() messages to all the threads before we try to join |
- // on them. |
- for (ApplicationThread* thread : application_threads_) |
- thread->RequestQuit(); |
- |
// This will delete all threads. This also performs a blocking join, waiting |
// for the threads to end. |
application_threads_.clear(); |
@@ -181,24 +144,10 @@ void CoreServicesApplicationDelegate::StartApplication( |
else |
NOTREACHED() << "This application package does not support " << url; |
- base::Thread::Options thread_options; |
- |
- // In the case of mojo:network_service, we must use an IO message loop. |
- if (url == "mojo://network_service/") { |
- thread_options.message_loop_type = base::MessageLoop::TYPE_IO; |
- } else if (url == "mojo://view_manager/") { |
- thread_options.message_loop_type = base::MessageLoop::TYPE_UI; |
- } else { |
- // We must use a MessagePumpMojo to awake on mojo messages. |
- thread_options.message_pump_factory = |
- base::Bind(&mojo::common::MessagePumpMojo::Create); |
- } |
- |
scoped_ptr<ApplicationThread> thread( |
new ApplicationThread(weak_factory_.GetWeakPtr(), url, delegate.Pass(), |
- request.Pass())); |
- thread->StartWithOptions(thread_options); |
- |
+ request.Pass())); |
+ thread->Start(); |
application_threads_.push_back(thread.Pass()); |
} |