OLD | NEW |
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/message_pump_mac.h" | 5 #include "base/message_pump_mac.h" |
6 | 6 |
7 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
8 #import <Foundation/Foundation.h> | 8 #import <Foundation/Foundation.h> |
9 #include <IOKit/IOMessage.h> | 9 #include <IOKit/IOMessage.h> |
10 #include <IOKit/pwr_mgt/IOPMLib.h> | 10 #include <IOKit/pwr_mgt/IOPMLib.h> |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 } | 218 } |
219 | 219 |
220 // May be called on any thread. | 220 // May be called on any thread. |
221 void MessagePumpCFRunLoopBase::ScheduleWork() { | 221 void MessagePumpCFRunLoopBase::ScheduleWork() { |
222 CFRunLoopSourceSignal(work_source_); | 222 CFRunLoopSourceSignal(work_source_); |
223 CFRunLoopWakeUp(run_loop_); | 223 CFRunLoopWakeUp(run_loop_); |
224 } | 224 } |
225 | 225 |
226 // Must be called on the run loop thread. | 226 // Must be called on the run loop thread. |
227 void MessagePumpCFRunLoopBase::ScheduleDelayedWork( | 227 void MessagePumpCFRunLoopBase::ScheduleDelayedWork( |
228 const Time& delayed_work_time) { | 228 const TimeTicks& delayed_work_time) { |
| 229 // TODO(jar): We may need a more efficient way to go between these times, but |
| 230 // the difference will change not only when we sleep/wake, it will also change |
| 231 // when the user changes the wall clock time :-/. |
| 232 Time absolute_work_time = |
| 233 (delayed_work_time - TimeTicks::Now()) + Time::Now(); |
| 234 |
229 Time::Exploded exploded; | 235 Time::Exploded exploded; |
230 delayed_work_time.UTCExplode(&exploded); | 236 absolute_work_time.UTCExplode(&exploded); |
231 double seconds = exploded.second + | 237 double seconds = exploded.second + |
232 (static_cast<double>((delayed_work_time.ToInternalValue()) % | 238 (static_cast<double>((absolute_work_time.ToInternalValue()) % |
233 Time::kMicrosecondsPerSecond) / | 239 Time::kMicrosecondsPerSecond) / |
234 Time::kMicrosecondsPerSecond); | 240 Time::kMicrosecondsPerSecond); |
235 CFGregorianDate gregorian = { | 241 CFGregorianDate gregorian = { |
236 exploded.year, | 242 exploded.year, |
237 exploded.month, | 243 exploded.month, |
238 exploded.day_of_month, | 244 exploded.day_of_month, |
239 exploded.hour, | 245 exploded.hour, |
240 exploded.minute, | 246 exploded.minute, |
241 seconds | 247 seconds |
242 }; | 248 }; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 return false; | 319 return false; |
314 } | 320 } |
315 | 321 |
316 // The NSApplication-based run loop only drains the autorelease pool at each | 322 // The NSApplication-based run loop only drains the autorelease pool at each |
317 // UI event (NSEvent). The autorelease pool is not drained for each | 323 // UI event (NSEvent). The autorelease pool is not drained for each |
318 // CFRunLoopSource target that's run. Use a local pool for any autoreleased | 324 // CFRunLoopSource target that's run. Use a local pool for any autoreleased |
319 // objects if the app is not currently handling a UI event to ensure they're | 325 // objects if the app is not currently handling a UI event to ensure they're |
320 // released promptly even in the absence of UI events. | 326 // released promptly even in the absence of UI events. |
321 MessagePumpScopedAutoreleasePool autorelease_pool(this); | 327 MessagePumpScopedAutoreleasePool autorelease_pool(this); |
322 | 328 |
323 Time next_time; | 329 TimeTicks next_time; |
324 delegate_->DoDelayedWork(&next_time); | 330 delegate_->DoDelayedWork(&next_time); |
325 | 331 |
326 bool more_work = !next_time.is_null(); | 332 bool more_work = !next_time.is_null(); |
327 if (more_work) { | 333 if (more_work) { |
328 TimeDelta delay = next_time - Time::Now(); | 334 TimeDelta delay = next_time - TimeTicks::Now(); |
329 if (delay > TimeDelta()) { | 335 if (delay > TimeDelta()) { |
330 // There's more delayed work to be done in the future. | 336 // There's more delayed work to be done in the future. |
331 ScheduleDelayedWork(next_time); | 337 ScheduleDelayedWork(next_time); |
332 } else { | 338 } else { |
333 // There's more delayed work to be done, and its time is in the past. | 339 // There's more delayed work to be done, and its time is in the past. |
334 // Arrange to come back here directly as long as the loop is still | 340 // Arrange to come back here directly as long as the loop is still |
335 // running. | 341 // running. |
336 CFRunLoopSourceSignal(delayed_work_source_); | 342 CFRunLoopSourceSignal(delayed_work_source_); |
337 } | 343 } |
338 } | 344 } |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 // static | 763 // static |
758 MessagePump* MessagePumpMac::Create() { | 764 MessagePump* MessagePumpMac::Create() { |
759 if ([NSThread isMainThread]) { | 765 if ([NSThread isMainThread]) { |
760 return new MessagePumpNSApplication; | 766 return new MessagePumpNSApplication; |
761 } | 767 } |
762 | 768 |
763 return new MessagePumpNSRunLoop; | 769 return new MessagePumpNSRunLoop; |
764 } | 770 } |
765 | 771 |
766 } // namespace base | 772 } // namespace base |
OLD | NEW |