| Index: base/message_loop/message_loop.cc
|
| diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
|
| index 4222c774dd58b20354d6b0e4c948efcbbf5abf1b..6bd6730cde34752a3e7db50ee8d2f153379013da 100644
|
| --- a/base/message_loop/message_loop.cc
|
| +++ b/base/message_loop/message_loop.cc
|
| @@ -19,6 +19,7 @@
|
| #include "base/thread_task_runner_handle.h"
|
| #include "base/threading/thread_local.h"
|
| #include "base/time/time.h"
|
| +#include "base/trace_event/trace_event.h"
|
| #include "base/tracked_objects.h"
|
|
|
| #if defined(OS_MACOSX)
|
| @@ -170,7 +171,8 @@ MessageLoop::~MessageLoop() {
|
| // Tell the incoming queue that we are dying.
|
| incoming_task_queue_->WillDestroyCurrentMessageLoop();
|
| incoming_task_queue_ = NULL;
|
| - message_loop_proxy_ = NULL;
|
| + unbound_task_runner_ = NULL;
|
| + task_runner_ = NULL;
|
|
|
| // OK, now make it so that no one can find us.
|
| lazy_tls_ptr.Pointer()->Set(NULL);
|
| @@ -257,27 +259,27 @@ void MessageLoop::RemoveDestructionObserver(
|
| void MessageLoop::PostTask(
|
| const tracked_objects::Location& from_here,
|
| const Closure& task) {
|
| - message_loop_proxy_->PostTask(from_here, task);
|
| + task_runner_->PostTask(from_here, task);
|
| }
|
|
|
| void MessageLoop::PostDelayedTask(
|
| const tracked_objects::Location& from_here,
|
| const Closure& task,
|
| TimeDelta delay) {
|
| - message_loop_proxy_->PostDelayedTask(from_here, task, delay);
|
| + task_runner_->PostDelayedTask(from_here, task, delay);
|
| }
|
|
|
| void MessageLoop::PostNonNestableTask(
|
| const tracked_objects::Location& from_here,
|
| const Closure& task) {
|
| - message_loop_proxy_->PostNonNestableTask(from_here, task);
|
| + task_runner_->PostNonNestableTask(from_here, task);
|
| }
|
|
|
| void MessageLoop::PostNonNestableDelayedTask(
|
| const tracked_objects::Location& from_here,
|
| const Closure& task,
|
| TimeDelta delay) {
|
| - message_loop_proxy_->PostNonNestableDelayedTask(from_here, task, delay);
|
| + task_runner_->PostNonNestableDelayedTask(from_here, task, delay);
|
| }
|
|
|
| void MessageLoop::Run() {
|
| @@ -367,6 +369,7 @@ bool MessageLoop::IsIdleForTesting() {
|
|
|
| //------------------------------------------------------------------------------
|
|
|
| +// static
|
| scoped_ptr<MessageLoop> MessageLoop::CreateUnbound(
|
| Type type, MessagePumpFactoryCallback pump_factory) {
|
| return make_scoped_ptr(new MessageLoop(type, pump_factory));
|
| @@ -386,8 +389,9 @@ MessageLoop::MessageLoop(Type type, MessagePumpFactoryCallback pump_factory)
|
| message_histogram_(NULL),
|
| run_loop_(NULL),
|
| incoming_task_queue_(new internal::IncomingTaskQueue(this)),
|
| - message_loop_proxy_(
|
| - new internal::MessageLoopProxyImpl(incoming_task_queue_)) {
|
| + unbound_task_runner_(
|
| + new internal::MessageLoopTaskRunner(incoming_task_queue_)),
|
| + task_runner_(unbound_task_runner_) {
|
| // If type is TYPE_CUSTOM non-null pump_factory must be given.
|
| DCHECK_EQ(type_ == TYPE_CUSTOM, !pump_factory_.is_null());
|
| }
|
| @@ -403,9 +407,26 @@ void MessageLoop::BindToCurrentThread() {
|
| lazy_tls_ptr.Pointer()->Set(this);
|
|
|
| incoming_task_queue_->StartScheduling();
|
| - message_loop_proxy_->BindToCurrentThread();
|
| - thread_task_runner_handle_.reset(
|
| - new ThreadTaskRunnerHandle(message_loop_proxy_));
|
| + unbound_task_runner_->BindToCurrentThread();
|
| + unbound_task_runner_ = nullptr;
|
| + SetThreadTaskRunnerHandle();
|
| +}
|
| +
|
| +void MessageLoop::SetTaskRunner(
|
| + scoped_refptr<SingleThreadTaskRunner> task_runner) {
|
| + DCHECK_EQ(this, current());
|
| + DCHECK(task_runner->BelongsToCurrentThread());
|
| + DCHECK(!unbound_task_runner_);
|
| + task_runner_ = task_runner.Pass();
|
| + SetThreadTaskRunnerHandle();
|
| +}
|
| +
|
| +void MessageLoop::SetThreadTaskRunnerHandle() {
|
| + DCHECK_EQ(this, current());
|
| + // Clear the previous thread task runner first because only one can exist at
|
| + // a time.
|
| + thread_task_runner_handle_.reset();
|
| + thread_task_runner_handle_.reset(new ThreadTaskRunnerHandle(task_runner_));
|
| }
|
|
|
| void MessageLoop::RunHandler() {
|
| @@ -453,10 +474,11 @@ void MessageLoop::RunTask(const PendingTask& pending_task) {
|
|
|
| HistogramEvent(kTaskRunEvent);
|
|
|
| + TRACE_TASK_EXECUTION("toplevel", pending_task);
|
| +
|
| FOR_EACH_OBSERVER(TaskObserver, task_observers_,
|
| WillProcessTask(pending_task));
|
| - task_annotator_.RunTask(
|
| - "MessageLoop::PostTask", "MessageLoop::RunTask", pending_task);
|
| + task_annotator_.RunTask("MessageLoop::PostTask", pending_task);
|
| FOR_EACH_OBSERVER(TaskObserver, task_observers_,
|
| DidProcessTask(pending_task));
|
|
|
|
|