Chromium Code Reviews| Index: base/threading/thread.h |
| diff --git a/base/threading/thread.h b/base/threading/thread.h |
| index 5010f0ec428bdcc69e54a9fdfe723862cacd75aa..85426ab8205965c93291655e8060e757e7d953cb 100644 |
| --- a/base/threading/thread.h |
| +++ b/base/threading/thread.h |
| @@ -13,11 +13,13 @@ |
| #include "base/message_loop/message_loop.h" |
| #include "base/message_loop/message_loop_proxy.h" |
| #include "base/message_loop/timer_slack.h" |
| +#include "base/synchronization/lock.h" |
| #include "base/threading/platform_thread.h" |
| namespace base { |
| class MessagePump; |
| +class WaitableEvent; |
| // A simple thread abstraction that establishes a MessageLoop on a new thread. |
| // The consumer uses the MessageLoop of the thread to cause code to execute on |
| @@ -45,7 +47,7 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
| // This is ignored if message_pump_factory.is_null() is false. |
| MessageLoop::Type message_loop_type; |
| - // Specify timer slack for thread message loop. |
| + // Specifies timer slack for thread message loop. |
| TimerSlack timer_slack; |
| // Used to create the MessagePump for the MessageLoop. The callback is Run() |
| @@ -81,7 +83,7 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
| // init_com_with_mta(false) and then StartWithOptions() with any message loop |
| // type other than TYPE_UI. |
| void init_com_with_mta(bool use_mta) { |
| - DCHECK(!started_); |
| + DCHECK(!start_event_); |
| com_status_ = use_mta ? MTA : STA; |
| } |
| #endif |
| @@ -103,6 +105,16 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
| // callback. |
| bool StartWithOptions(const Options& options); |
| + // Starts the thread and wait for the thread to start and run initialization |
| + // before returning. It's same as calling Start() and then |
| + // WaitUntilThreadStarted(). |
| + // Note that using this (instead of Start() or StartWithOptions() causes |
| + // jank on the calling thread, and must be used carefully for production code. |
| + bool StartAndWait(); |
| + |
| + // Blocks until the thread starts running. Supposed to be used for testing. |
| + bool WaitUntilThreadStarted(); |
|
rvargas (doing something else)
2015/03/26 02:19:28
nit: Add ForTest(/ing) to the name?
kinuko
2015/04/13 02:03:00
It's also internally called in StartAndWait().. ad
|
| + |
| // Signals the thread to exit and returns once the thread has exited. After |
| // this method returns, the Thread object is completely reset and may be used |
| // as if it were newly constructed (i.e., Start may be called again). |
| @@ -166,7 +178,7 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
| PlatformThreadHandle thread_handle() { return thread_; } |
| // The thread ID. |
| - PlatformThreadId thread_id() const { return thread_id_; } |
| + PlatformThreadId thread_id() const { return thread_.id(); } |
| // Returns true if the thread has been started, and not yet stopped. |
| bool IsRunning() const; |
| @@ -203,25 +215,22 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
| // PlatformThread::Delegate methods: |
| void ThreadMain() override; |
| + // Returns true while inside of Run(). |
| + bool IsInRunLoop() const; |
|
rvargas (doing something else)
2015/03/26 02:19:28
Why is this not a replacement for IsRunning()? And
|
| + |
| #if defined(OS_WIN) |
| // Whether this thread needs to initialize COM, and if so, in what mode. |
| ComStatus com_status_; |
| #endif |
| - // Whether we successfully started the thread. |
| - bool started_; |
| - |
| // If true, we're in the middle of stopping, and shouldn't access |
| // |message_loop_|. It may non-NULL and invalid. |
| bool stopping_; |
| // True while inside of Run(). |
| + mutable base::Lock lock_; |
| bool running_; |
| - // Used to pass data to ThreadMain. |
| - struct StartupData; |
| - StartupData* startup_data_; |
| - |
| // The thread's handle. |
| PlatformThreadHandle thread_; |
| @@ -229,12 +238,12 @@ class BASE_EXPORT Thread : PlatformThread::Delegate { |
| // by the created thread. |
| MessageLoop* message_loop_; |
| - // Our thread's ID. |
| - PlatformThreadId thread_id_; |
| - |
| // The name of the thread. Used for debugging purposes. |
| std::string name_; |
| + // Non-null if the thread has successfully started. |
| + scoped_ptr<WaitableEvent> start_event_; |
| + |
| friend void ThreadQuitHelper(); |
| DISALLOW_COPY_AND_ASSIGN(Thread); |