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); |
} |