| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_loop.h" | 5 #include "base/message_loop.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/message_pump_default.h" | 13 #include "base/message_pump_default.h" |
| 14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/scoped_ptr.h" | 15 #include "base/scoped_ptr.h" |
| 16 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" | 16 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
| 17 #include "base/threading/thread_local.h" | 17 #include "base/threading/thread_local.h" |
| 18 #include "base/time.h" |
| 18 #include "base/tracked_objects.h" | 19 #include "base/tracked_objects.h" |
| 19 | 20 |
| 20 #if defined(OS_MACOSX) | 21 #if defined(OS_MACOSX) |
| 21 #include "base/message_pump_mac.h" | 22 #include "base/message_pump_mac.h" |
| 22 #endif | 23 #endif |
| 23 #if defined(OS_POSIX) | 24 #if defined(OS_POSIX) |
| 24 #include "base/message_pump_libevent.h" | 25 #include "base/message_pump_libevent.h" |
| 25 #endif | 26 #endif |
| 26 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 27 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 27 #include <gdk/gdk.h> | 28 #include <gdk/gdk.h> |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 break; | 220 break; |
| 220 } | 221 } |
| 221 DCHECK(!did_work); | 222 DCHECK(!did_work); |
| 222 | 223 |
| 223 // Let interested parties have one last shot at accessing this. | 224 // Let interested parties have one last shot at accessing this. |
| 224 FOR_EACH_OBSERVER(DestructionObserver, destruction_observers_, | 225 FOR_EACH_OBSERVER(DestructionObserver, destruction_observers_, |
| 225 WillDestroyCurrentMessageLoop()); | 226 WillDestroyCurrentMessageLoop()); |
| 226 | 227 |
| 227 // OK, now make it so that no one can find us. | 228 // OK, now make it so that no one can find us. |
| 228 lazy_tls_ptr.Pointer()->Set(NULL); | 229 lazy_tls_ptr.Pointer()->Set(NULL); |
| 230 |
| 231 #if defined(OS_WIN) |
| 232 // If we left the high-resolution timer activated, deactivate it now. |
| 233 // Doing this is not-critical, it is mainly to make sure we track |
| 234 // the high resolution timer activations properly in our unit tests. |
| 235 if (!high_resolution_timer_expiration_.is_null()) { |
| 236 base::Time::ActivateHighResolutionTimer(false); |
| 237 high_resolution_timer_expiration_ = base::TimeTicks(); |
| 238 } |
| 239 #endif |
| 229 } | 240 } |
| 230 | 241 |
| 231 // static | 242 // static |
| 232 MessageLoop* MessageLoop::current() { | 243 MessageLoop* MessageLoop::current() { |
| 233 // TODO(darin): sadly, we cannot enable this yet since people call us even | 244 // TODO(darin): sadly, we cannot enable this yet since people call us even |
| 234 // when they have no intention of using us. | 245 // when they have no intention of using us. |
| 235 // DCHECK(loop) << "Ouch, did you forget to initialize me?"; | 246 // DCHECK(loop) << "Ouch, did you forget to initialize me?"; |
| 236 return lazy_tls_ptr.Pointer()->Get(); | 247 return lazy_tls_ptr.Pointer()->Get(); |
| 237 } | 248 } |
| 238 | 249 |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 #if defined(OS_WIN) | 576 #if defined(OS_WIN) |
| 566 if (high_resolution_timer_expiration_.is_null()) { | 577 if (high_resolution_timer_expiration_.is_null()) { |
| 567 // Windows timers are granular to 15.6ms. If we only set high-res | 578 // Windows timers are granular to 15.6ms. If we only set high-res |
| 568 // timers for those under 15.6ms, then a 18ms timer ticks at ~32ms, | 579 // timers for those under 15.6ms, then a 18ms timer ticks at ~32ms, |
| 569 // which as a percentage is pretty inaccurate. So enable high | 580 // which as a percentage is pretty inaccurate. So enable high |
| 570 // res timers for any timer which is within 2x of the granularity. | 581 // res timers for any timer which is within 2x of the granularity. |
| 571 // This is a tradeoff between accuracy and power management. | 582 // This is a tradeoff between accuracy and power management. |
| 572 bool needs_high_res_timers = | 583 bool needs_high_res_timers = |
| 573 delay_ms < (2 * base::Time::kMinLowResolutionThresholdMs); | 584 delay_ms < (2 * base::Time::kMinLowResolutionThresholdMs); |
| 574 if (needs_high_res_timers) { | 585 if (needs_high_res_timers) { |
| 575 base::Time::ActivateHighResolutionTimer(true); | 586 if (base::Time::ActivateHighResolutionTimer(true)) { |
| 576 high_resolution_timer_expiration_ = TimeTicks::Now() + | 587 high_resolution_timer_expiration_ = TimeTicks::Now() + |
| 577 TimeDelta::FromMilliseconds(kHighResolutionTimerModeLeaseTimeMs); | 588 TimeDelta::FromMilliseconds(kHighResolutionTimerModeLeaseTimeMs); |
| 589 } |
| 578 } | 590 } |
| 579 } | 591 } |
| 580 #endif | 592 #endif |
| 581 } else { | 593 } else { |
| 582 DCHECK_EQ(delay_ms, 0) << "delay should not be negative"; | 594 DCHECK_EQ(delay_ms, 0) << "delay should not be negative"; |
| 583 } | 595 } |
| 584 | 596 |
| 585 #if defined(OS_WIN) | 597 #if defined(OS_WIN) |
| 586 if (!high_resolution_timer_expiration_.is_null()) { | 598 if (!high_resolution_timer_expiration_.is_null()) { |
| 587 if (TimeTicks::Now() > high_resolution_timer_expiration_) { | 599 if (TimeTicks::Now() > high_resolution_timer_expiration_) { |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 Watcher *delegate) { | 849 Watcher *delegate) { |
| 838 return pump_libevent()->WatchFileDescriptor( | 850 return pump_libevent()->WatchFileDescriptor( |
| 839 fd, | 851 fd, |
| 840 persistent, | 852 persistent, |
| 841 static_cast<base::MessagePumpLibevent::Mode>(mode), | 853 static_cast<base::MessagePumpLibevent::Mode>(mode), |
| 842 controller, | 854 controller, |
| 843 delegate); | 855 delegate); |
| 844 } | 856 } |
| 845 | 857 |
| 846 #endif | 858 #endif |
| OLD | NEW |