Index: base/message_loop/message_loop.cc |
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc |
index 8991ff3a86f4fd7cce39fd4f32c439aed6d7ede3..e078b1f5730af42f96c736ab5888c52608b0f045 100644 |
--- a/base/message_loop/message_loop.cc |
+++ b/base/message_loop/message_loop.cc |
@@ -97,7 +97,11 @@ MessageLoop::~MessageLoop() { |
// iOS just attaches to the loop, it doesn't Run it. |
// TODO(stuartmorgan): Consider wiring up a Detach(). |
#if !defined(OS_IOS) |
- DCHECK(!run_loop_); |
+ // There should be no active RunLoops on this thread, unless this MessageLoop |
+ // isn't bound to the current thread (see other condition at the top of this |
+ // method). |
+ DCHECK((!pump_ && current() != this) || |
+ !run_loop_client_->GetTopMostRunLoop()); |
#endif |
#if defined(OS_WIN) |
@@ -136,8 +140,6 @@ MessageLoop::~MessageLoop() { |
// OK, now make it so that no one can find us. |
if (current() == this) |
GetTLSMessageLoop()->Set(nullptr); |
- |
- RunLoop::ResetTLSState(); |
} |
// static |
@@ -216,20 +218,16 @@ void MessageLoop::RemoveDestructionObserver( |
void MessageLoop::QuitWhenIdle() { |
DCHECK_EQ(this, current()); |
- if (run_loop_) { |
- run_loop_->QuitWhenIdle(); |
- } else { |
- NOTREACHED() << "Must be inside Run to call QuitWhenIdle"; |
- } |
+ DCHECK(run_loop_client_->GetTopMostRunLoop()) |
+ << "Must be inside Run to call QuitWhenIdle"; |
+ run_loop_client_->GetTopMostRunLoop()->QuitWhenIdle(); |
} |
void MessageLoop::QuitNow() { |
DCHECK_EQ(this, current()); |
- if (run_loop_) { |
- pump_->Quit(); |
- } else { |
- NOTREACHED() << "Must be inside Run to call Quit"; |
- } |
+ DCHECK(run_loop_client_->GetTopMostRunLoop()) |
+ << "Must be inside Run to call Quit"; |
+ pump_->Quit(); |
} |
bool MessageLoop::IsType(Type type) const { |
@@ -247,7 +245,7 @@ Closure MessageLoop::QuitWhenIdleClosure() { |
void MessageLoop::SetNestableTasksAllowed(bool allowed) { |
if (allowed) { |
- CHECK(base::RunLoop::IsNestingAllowedOnCurrentThread()); |
+ CHECK(RunLoop::IsNestingAllowedOnCurrentThread()); |
// Kick the native pump just in case we enter a OS-driven nested message |
// loop. |
@@ -302,7 +300,6 @@ MessageLoop::MessageLoop(Type type, MessagePumpFactoryCallback pump_factory) |
#endif |
nestable_tasks_allowed_(true), |
pump_factory_(std::move(pump_factory)), |
- run_loop_(nullptr), |
current_pending_task_(nullptr), |
incoming_task_queue_(new internal::IncomingTaskQueue(this)), |
unbound_task_runner_( |
@@ -328,6 +325,8 @@ void MessageLoop::BindToCurrentThread() { |
unbound_task_runner_ = nullptr; |
SetThreadTaskRunnerHandle(); |
thread_id_ = PlatformThread::CurrentId(); |
+ |
+ run_loop_client_ = RunLoop::RegisterDelegateForCurrentThread(this); |
} |
std::string MessageLoop::GetThreadName() const { |
@@ -354,6 +353,16 @@ void MessageLoop::ClearTaskRunnerForTesting() { |
thread_task_runner_handle_.reset(); |
} |
+void MessageLoop::Run() { |
+ DCHECK_EQ(this, current()); |
+ pump_->Run(this); |
+} |
+ |
+void MessageLoop::Quit() { |
+ DCHECK_EQ(this, current()); |
+ QuitNow(); |
+} |
+ |
void MessageLoop::SetThreadTaskRunnerHandle() { |
DCHECK_EQ(this, current()); |
// Clear the previous thread task runner first, because only one can exist at |
@@ -362,14 +371,8 @@ void MessageLoop::SetThreadTaskRunnerHandle() { |
thread_task_runner_handle_.reset(new ThreadTaskRunnerHandle(task_runner_)); |
} |
-void MessageLoop::RunHandler() { |
- DCHECK_EQ(this, current()); |
- DCHECK(run_loop_); |
- pump_->Run(this); |
-} |
- |
bool MessageLoop::ProcessNextDelayedNonNestableTask() { |
- if (is_nested_) |
+ if (run_loop_client_->IsNested()) |
return false; |
if (deferred_non_nestable_work_queue_.empty()) |
@@ -411,7 +414,7 @@ void MessageLoop::RunTask(PendingTask* pending_task) { |
} |
bool MessageLoop::DeferOrRunPendingTask(PendingTask pending_task) { |
- if (pending_task.nestable || !is_nested_) { |
+ if (pending_task.nestable || !run_loop_client_->IsNested()) { |
RunTask(&pending_task); |
// Show that we ran a task (Note: a new one might arrive as a |
// consequence!). |
@@ -546,7 +549,7 @@ bool MessageLoop::DoIdleWork() { |
if (ProcessNextDelayedNonNestableTask()) |
return true; |
- if (run_loop_->quit_when_idle_received_) |
+ if (run_loop_client_->GetTopMostRunLoop()->quit_when_idle_received_) |
pump_->Quit(); |
// When we return we will do a kernel wait for more tasks. |