Index: base/threading/thread.cc |
diff --git a/base/threading/thread.cc b/base/threading/thread.cc |
index 7bff24232e2bf2d66fda4485a4246ebae2e98332..d1348ecc339954fe070e620187add59ebd44cf37 100644 |
--- a/base/threading/thread.cc |
+++ b/base/threading/thread.cc |
@@ -62,6 +62,8 @@ Thread::Thread(const std::string& name) |
stopping_(false), |
running_(false), |
thread_(0), |
+ id_(kInvalidThreadId), |
+ id_event_(true, false), |
message_loop_(nullptr), |
message_loop_timer_slack_(TIMER_SLACK_NONE), |
name_(name) { |
@@ -87,6 +89,10 @@ bool Thread::StartWithOptions(const Options& options) { |
(options.message_loop_type == MessageLoop::TYPE_UI)); |
#endif |
+ // Reset |id_| here to support restarting the thread. |
+ id_event_.Reset(); |
+ id_ = kInvalidThreadId; |
+ |
SetThreadWasQuitProperly(false); |
MessageLoop::Type type = options.message_loop_type; |
@@ -177,8 +183,10 @@ void Thread::StopSoon() { |
} |
PlatformThreadId Thread::thread_id() const { |
- AutoLock lock(thread_lock_); |
- return thread_.id(); |
+ // If the thread is created but not started yet, wait for |id_| being ready. |
+ base::ThreadRestrictions::ScopedAllowWait allow_wait; |
+ id_event_.Wait(); |
+ return id_; |
} |
bool Thread::IsRunning() const { |
@@ -211,6 +219,12 @@ bool Thread::GetThreadWasQuitProperly() { |
} |
void Thread::ThreadMain() { |
+ // First, make thread_id() available to avoid deadlocks. It could be called |
+ // any place in the following thread initialization code. |
+ id_ = PlatformThread::CurrentId(); |
+ DCHECK_NE(kInvalidThreadId, id_); |
+ id_event_.Signal(); |
+ |
// Complete the initialization of our Thread object. |
PlatformThread::SetName(name_.c_str()); |
ANNOTATE_THREAD_NAME(name_.c_str()); // Tell the name to race detector. |
@@ -231,10 +245,6 @@ void Thread::ThreadMain() { |
} |
#endif |
- // Make sure the thread_id() returns current thread. |
- // (This internally acquires lock against PlatformThread::Create) |
- DCHECK_EQ(thread_id(), PlatformThread::CurrentId()); |
- |
// Let the thread do extra initialization. |
Init(); |