Chromium Code Reviews| Index: base/message_loop/message_loop.cc |
| diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc |
| index 0eb24cf7d2f89641950bf36ba7768ca7d2dc7ccc..fc2a61433af3b78ec3deb3884f8bdf692fc8e717 100644 |
| --- a/base/message_loop/message_loop.cc |
| +++ b/base/message_loop/message_loop.cc |
| @@ -367,6 +367,7 @@ bool MessageLoop::IsIdleForTesting() { |
| //------------------------------------------------------------------------------ |
| +// static |
| scoped_ptr<MessageLoop> MessageLoop::CreateUnbound( |
| Type type, MessagePumpFactoryCallback pump_factory) { |
| return make_scoped_ptr(new MessageLoop(type, pump_factory)); |
| @@ -403,7 +404,23 @@ void MessageLoop::BindToCurrentThread() { |
| incoming_task_queue_->StartScheduling(); |
| task_runner_->BindToCurrentThread(); |
| - thread_task_runner_handle_.reset(new ThreadTaskRunnerHandle(task_runner_)); |
| + SwapTaskRunner(task_runner_); |
| +} |
| + |
| +scoped_refptr<BindableSingleThreadTaskRunner> MessageLoop::SwapTaskRunner( |
| + scoped_refptr<BindableSingleThreadTaskRunner> task_runner) { |
| + // If this message loop was already bound to a thread, ensure the task runner |
| + // belongs to the same thread and update the thread task runner handle. |
| + // Otherwise the task runner will be bound later in BindToCurrentThread(). |
| + if (pump_) { |
| + DCHECK_EQ(this, current()); |
| + DCHECK(task_runner->BelongsToCurrentThread()); |
| + thread_task_runner_handle_.reset(); |
| + thread_task_runner_handle_.reset(new ThreadTaskRunnerHandle(task_runner)); |
|
kinuko
2015/06/25 05:58:08
nit: no need to call reset() twice, line 418 is no
alexclarke
2015/06/25 09:36:51
Done.
|
| + } |
| + scoped_refptr<BindableSingleThreadTaskRunner> previous_runner = task_runner_; |
|
kinuko
2015/06/25 05:58:08
nit: task_runner_.Pass() might be slightly better
|
| + task_runner_ = task_runner; |
| + return previous_runner; |
| } |
| void MessageLoop::RunHandler() { |