Index: base/message_loop/message_pump_default.cc |
diff --git a/base/message_loop/message_pump_default.cc b/base/message_loop/message_pump_default.cc |
index 27c19e0227bc6f9d6c0f0d71562a2d14c466a42c..aca56bc802747f7bad9c7a31e7e28a9c113c77bc 100644 |
--- a/base/message_loop/message_pump_default.cc |
+++ b/base/message_loop/message_pump_default.cc |
@@ -15,7 +15,12 @@ namespace base { |
MessagePumpDefault::MessagePumpDefault() |
: keep_running_(true), |
+#if defined(OS_WIN) |
event_(false, false) { |
+#elif defined(OS_POSIX) |
+ needs_wake_up_(false), |
+ cv_(&lock_) { |
+#endif |
} |
MessagePumpDefault::~MessagePumpDefault() { |
@@ -49,11 +54,11 @@ void MessagePumpDefault::Run(Delegate* delegate) { |
ThreadRestrictions::ScopedAllowWait allow_wait; |
if (delayed_work_time_.is_null()) { |
- event_.Wait(); |
+ Wait(); |
} else { |
TimeDelta delay = delayed_work_time_ - TimeTicks::Now(); |
if (delay > TimeDelta()) { |
- event_.TimedWait(delay); |
+ TimedWait(delay); |
} else { |
// It looks like delayed_work_time_ indicates a time in the past, so we |
// need to call DoDelayedWork now. |
@@ -74,7 +79,7 @@ void MessagePumpDefault::Quit() { |
void MessagePumpDefault::ScheduleWork() { |
// Since this can be called on any thread, we need to ensure that our Run |
// loop wakes up. |
- event_.Signal(); |
+ Signal(); |
} |
void MessagePumpDefault::ScheduleDelayedWork( |
@@ -85,4 +90,37 @@ void MessagePumpDefault::ScheduleDelayedWork( |
delayed_work_time_ = delayed_work_time; |
} |
+void MessagePumpDefault::Wait() { |
+#if defined(OS_WIN) |
+ event_.Wait(); |
+#else |
+ AutoLock lock(lock_); |
+ while (!needs_wake_up_) |
+ cv_.Wait(); |
+ needs_wake_up_ = false; |
+#endif |
+} |
+ |
+void MessagePumpDefault::TimedWait(const TimeDelta& max_time) { |
+#if defined(OS_WIN) |
+ event_.TimedWait(max_time); |
+#else |
+ AutoLock lock(lock_); |
+ cv_.TimedWait(max_time); |
darin (slow to review)
2014/09/09 06:21:07
TODO: you'll need to protect this against spurious
|
+ needs_wake_up_ = false; |
+#endif |
+} |
+ |
+void MessagePumpDefault::Signal() { |
+#if defined(OS_WIN) |
+ event_.Signal(); |
+#else |
+ { |
+ AutoLock lock(lock_); |
+ needs_wake_up_ = true; |
jamesr
2014/09/22 17:42:28
try adding:
if (needs_wake_up_)
return;
to avo
|
+ } |
+ cv_.Signal(); |
+#endif |
+} |
+ |
} // namespace base |