| Index: base/message_loop/message_loop.cc
|
| diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
|
| index 785287fcf6189a202115c168a5a085508a0f4c9b..6dfc5c551db0b2e2dff034716ab0188c95062176 100644
|
| --- a/base/message_loop/message_loop.cc
|
| +++ b/base/message_loop/message_loop.cc
|
| @@ -171,6 +171,7 @@ MessageLoop::~MessageLoop() {
|
| // Tell the incoming queue that we are dying.
|
| incoming_task_queue_->WillDestroyCurrentMessageLoop();
|
| incoming_task_queue_ = NULL;
|
| + unbound_task_runner_ = NULL;
|
| task_runner_ = NULL;
|
|
|
| // OK, now make it so that no one can find us.
|
| @@ -368,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));
|
| @@ -387,7 +389,9 @@ MessageLoop::MessageLoop(Type type, MessagePumpFactoryCallback pump_factory)
|
| message_histogram_(NULL),
|
| run_loop_(NULL),
|
| incoming_task_queue_(new internal::IncomingTaskQueue(this)),
|
| - task_runner_(new internal::MessageLoopTaskRunner(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,7 +407,25 @@ void MessageLoop::BindToCurrentThread() {
|
| lazy_tls_ptr.Pointer()->Set(this);
|
|
|
| incoming_task_queue_->StartScheduling();
|
| - task_runner_->BindToCurrentThread();
|
| + 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_));
|
| }
|
|
|
|
|