Chromium Code Reviews| Index: base/power_monitor/power_monitor.cc |
| diff --git a/base/power_monitor/power_monitor.cc b/base/power_monitor/power_monitor.cc |
| index 14dc4b517832785c07153abfed2bcc4a3a738940..81dbc80c68a1f8cb6d5b306ba1f2cd7c1f241893 100644 |
| --- a/base/power_monitor/power_monitor.cc |
| +++ b/base/power_monitor/power_monitor.cc |
| @@ -3,58 +3,106 @@ |
| // found in the LICENSE file. |
| #include "base/power_monitor/power_monitor.h" |
| + |
| +#include "base/lazy_instance.h" |
| #include "base/power_monitor/power_monitor_source.h" |
| +#include "base/synchronization/lock.h" |
| namespace base { |
| +LazyInstance<Lock>::Leaky g_power_monitor_lock = LAZY_INSTANCE_INITIALIZER; |
| static PowerMonitor* g_power_monitor = NULL; |
| +void PowerMonitor::Initialize(scoped_ptr<PowerMonitorSource> source) { |
| + AutoLock(g_power_monitor_lock.Get()); |
| + DCHECK(!g_power_monitor); |
| + g_power_monitor = new PowerMonitor(source.Pass()); |
| +} |
| + |
| +void PowerMonitor::Shutdown() { |
| + AutoLock(g_power_monitor_lock.Get()); |
| + if (g_power_monitor) { |
| + delete g_power_monitor; |
| + g_power_monitor = NULL; |
| + } |
| +} |
| + |
| +bool PowerMonitor::IsInitialized() { |
| + AutoLock(g_power_monitor_lock.Get()); |
| + return g_power_monitor != NULL; |
| +} |
| + |
| +bool PowerMonitor::AddObserver(PowerObserver* observer) { |
| + AutoLock(g_power_monitor_lock.Get()); |
| + if (!g_power_monitor) |
| + return false; |
|
Ken Russell (switch to Gerrit)
2014/02/28 21:30:09
Maybe this, RemoveObserver and IsOnBatteryPower sh
|
| + g_power_monitor->AddObserverImpl(observer); |
| + return true; |
| +} |
| + |
| +bool PowerMonitor::RemoveObserver(PowerObserver* observer) { |
| + AutoLock(g_power_monitor_lock.Get()); |
| + if (!g_power_monitor) |
| + return false; |
| + g_power_monitor->RemoveObserverImpl(observer); |
| + return true; |
| +} |
| + |
| +bool PowerMonitor::IsOnBatteryPower() { |
| + AutoLock(g_power_monitor_lock.Get()); |
| + if (!g_power_monitor) |
| + return false; |
| + return g_power_monitor->IsOnBatteryPowerImpl(); |
| +} |
| + |
| PowerMonitor::PowerMonitor(scoped_ptr<PowerMonitorSource> source) |
| : observers_(new ObserverListThreadSafe<PowerObserver>()), |
| source_(source.Pass()) { |
| - DCHECK(!g_power_monitor); |
| - g_power_monitor = this; |
| } |
| PowerMonitor::~PowerMonitor() { |
| - DCHECK_EQ(this, g_power_monitor); |
| - g_power_monitor = NULL; |
| } |
| -// static |
| -PowerMonitor* PowerMonitor::Get() { |
| +Lock* PowerMonitor::GetSingletonLock() { return &g_power_monitor_lock.Get(); } |
| + |
| +PowerMonitor* PowerMonitor::GetSingleton() { |
| + g_power_monitor_lock.Get().AssertAcquired(); |
| return g_power_monitor; |
| } |
| -void PowerMonitor::AddObserver(PowerObserver* obs) { |
| +void PowerMonitor::AddObserverImpl(PowerObserver* obs) { |
| + g_power_monitor_lock.Get().AssertAcquired(); |
| observers_->AddObserver(obs); |
| } |
| -void PowerMonitor::RemoveObserver(PowerObserver* obs) { |
| +void PowerMonitor::RemoveObserverImpl(PowerObserver* obs) { |
| + g_power_monitor_lock.Get().AssertAcquired(); |
| observers_->RemoveObserver(obs); |
| } |
| -PowerMonitorSource* PowerMonitor::Source() { |
| - return source_.get(); |
| -} |
| - |
| -bool PowerMonitor::IsOnBatteryPower() { |
| +bool PowerMonitor::IsOnBatteryPowerImpl() { |
| + g_power_monitor_lock.Get().AssertAcquired(); |
| return source_->IsOnBatteryPower(); |
| } |
| +PowerMonitorSource* PowerMonitor::Source() { return source_.get(); } |
| + |
| void PowerMonitor::NotifyPowerStateChange(bool battery_in_use) { |
| DVLOG(1) << "PowerStateChange: " << (battery_in_use ? "On" : "Off") |
| << " battery"; |
| + AutoLock(g_power_monitor_lock.Get()); |
| observers_->Notify(&PowerObserver::OnPowerStateChange, battery_in_use); |
| } |
| void PowerMonitor::NotifySuspend() { |
| DVLOG(1) << "Power Suspending"; |
| + AutoLock(g_power_monitor_lock.Get()); |
| observers_->Notify(&PowerObserver::OnSuspend); |
| } |
| void PowerMonitor::NotifyResume() { |
| DVLOG(1) << "Power Resuming"; |
| + AutoLock(g_power_monitor_lock.Get()); |
| observers_->Notify(&PowerObserver::OnResume); |
| } |