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) |
} |