Index: base/threading/thread.cc |
diff --git a/base/threading/thread.cc b/base/threading/thread.cc |
index 11aaea1d7f8af1e4dac805f4e60be34b74d9456b..a8833aeb3f39b553d15d41f66737b7d83bfcad54 100644 |
--- a/base/threading/thread.cc |
+++ b/base/threading/thread.cc |
@@ -5,6 +5,7 @@ |
#include "base/threading/thread.h" |
#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/lazy_instance.h" |
#include "base/location.h" |
#include "base/run_loop.h" |
@@ -32,12 +33,6 @@ base::LazyInstance<base::ThreadLocalBoolean> lazy_tls_bool = |
} // namespace |
-// This is used to trigger the message loop to exit. |
-void ThreadQuitHelper() { |
- MessageLoop::current()->QuitWhenIdle(); |
- Thread::SetThreadWasQuitProperly(true); |
-} |
- |
Thread::Options::Options() |
: message_loop_type(MessageLoop::TYPE_DEFAULT), |
timer_slack(TIMER_SLACK_NONE), |
@@ -178,7 +173,8 @@ void Thread::StopSoon() { |
return; |
stopping_ = true; |
- task_runner()->PostTask(FROM_HERE, base::Bind(&ThreadQuitHelper)); |
+ task_runner()->PostTask( |
+ FROM_HERE, base::Bind(&Thread::ThreadQuitHelper, Unretained(this))); |
} |
PlatformThreadId Thread::GetThreadId() const { |
@@ -201,8 +197,8 @@ bool Thread::IsRunning() const { |
return running_; |
} |
-void Thread::Run(MessageLoop* message_loop) { |
- RunLoop().Run(); |
+void Thread::Run(RunLoop* run_loop) { |
+ run_loop->Run(); |
} |
void Thread::SetThreadWasQuitProperly(bool flag) { |
@@ -253,7 +249,9 @@ void Thread::ThreadMain() { |
start_event_.Signal(); |
- Run(message_loop_); |
+ RunLoop run_loop; |
+ run_loop_ = &run_loop; |
+ Run(run_loop_); |
{ |
AutoLock lock(running_lock_); |
@@ -268,15 +266,22 @@ void Thread::ThreadMain() { |
#endif |
if (message_loop->type() != MessageLoop::TYPE_CUSTOM) { |
- // Assert that MessageLoop::QuitWhenIdle was called by ThreadQuitHelper. |
- // Don't check for custom message pumps, because their shutdown might not |
- // allow this. |
+ // Assert that RunLoop::QuitWhenIdle was called by ThreadQuitHelper. Don't |
+ // check for custom message pumps, because their shutdown might not allow |
+ // this. |
DCHECK(GetThreadWasQuitProperly()); |
} |
// We can't receive messages anymore. |
// (The message loop is destructed at the end of this block) |
message_loop_ = nullptr; |
+ run_loop_ = nullptr; |
+} |
+ |
+void Thread::ThreadQuitHelper() { |
+ DCHECK(run_loop_); |
+ run_loop_->QuitWhenIdle(); |
+ SetThreadWasQuitProperly(true); |
} |
} // namespace base |