Chromium Code Reviews| 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 |