| Index: webrtc/base/platform_thread.cc
|
| diff --git a/webrtc/base/platform_thread.cc b/webrtc/base/platform_thread.cc
|
| index 0b025f2af048f94d9e776f171276850f54ef952e..d1bd509bf1ad301591b0c4be6e648218cb196de4 100644
|
| --- a/webrtc/base/platform_thread.cc
|
| +++ b/webrtc/base/platform_thread.cc
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "webrtc/base/platform_thread.h"
|
|
|
| +#include "webrtc/base/atomicops.h"
|
| #include "webrtc/base/checks.h"
|
|
|
| #if defined(WEBRTC_LINUX)
|
| @@ -96,15 +97,7 @@ PlatformThread::PlatformThread(ThreadRunFunction func,
|
| const char* thread_name)
|
| : run_function_(func),
|
| obj_(obj),
|
| - name_(thread_name ? thread_name : "webrtc"),
|
| -#if defined(WEBRTC_WIN)
|
| - stop_(false),
|
| - thread_(NULL),
|
| - thread_id_(0) {
|
| -#else
|
| - stop_event_(false, false),
|
| - thread_(0) {
|
| -#endif // defined(WEBRTC_WIN)
|
| + name_(thread_name ? thread_name : "webrtc") {
|
| RTC_DCHECK(func);
|
| RTC_DCHECK(name_.length() < 64);
|
| }
|
| @@ -187,15 +180,26 @@ void PlatformThread::Stop() {
|
| thread_ = nullptr;
|
| thread_id_ = 0;
|
| #else
|
| - stop_event_.Set();
|
| + RTC_CHECK_EQ(1, AtomicOps::Increment(&stop_flag_));
|
| RTC_CHECK_EQ(0, pthread_join(thread_, nullptr));
|
| + AtomicOps::ReleaseStore(&stop_flag_, 0);
|
| thread_ = 0;
|
| #endif // defined(WEBRTC_WIN)
|
| }
|
|
|
| +// TODO(tommi): Deprecate the loop behavior in PlatformThread.
|
| +// * Introduce a new callback type that returns void.
|
| +// * Remove potential for a busy loop in PlatformThread.
|
| +// * Delegate the responsibility for how to stop the thread, to the
|
| +// implementation that actually uses the thread.
|
| +// All implementations will need to be aware of how the thread should be stopped
|
| +// and encouraging a busy polling loop, can be costly in terms of power and cpu.
|
| void PlatformThread::Run() {
|
| if (!name_.empty())
|
| rtc::SetCurrentThreadName(name_.c_str());
|
| +#if !defined(WEBRTC_MAC) && !defined(WEBRTC_WIN)
|
| + const struct timespec ts_null = {0};
|
| +#endif
|
| do {
|
| // The interface contract of Start/Stop is that for a successful call to
|
| // Start, there should be at least one call to the run function. So we
|
| @@ -207,7 +211,12 @@ void PlatformThread::Run() {
|
| SleepEx(0, true);
|
| } while (!stop_);
|
| #else
|
| - } while (!stop_event_.Wait(0));
|
| +#if defined(WEBRTC_MAC)
|
| + sched_yield();
|
| +#else
|
| + nanosleep(&ts_null, nullptr);
|
| +#endif
|
| + } while (!AtomicOps::AcquireLoad(&stop_flag_));
|
| #endif // defined(WEBRTC_WIN)
|
| }
|
|
|
|
|