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..b5902db5fa1c85b21ebd2a0d9aa12c440160ed46 100644 |
--- a/base/power_monitor/power_monitor.cc |
+++ b/base/power_monitor/power_monitor.cc |
@@ -3,34 +3,66 @@ |
// 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; |
+PowerMonitor* PowerMonitor::Create(scoped_ptr<PowerMonitorSource> source) { |
+ AutoLock(g_power_monitor_lock.Get()); |
+ return new PowerMonitor(source.Pass()); |
+} |
+ |
PowerMonitor::PowerMonitor(scoped_ptr<PowerMonitorSource> source) |
: observers_(new ObserverListThreadSafe<PowerObserver>()), |
source_(source.Pass()) { |
+ g_power_monitor_lock.Get().AssertAcquired(); |
DCHECK(!g_power_monitor); |
g_power_monitor = this; |
} |
PowerMonitor::~PowerMonitor() { |
+ AutoLock(g_power_monitor_lock.Get()); |
DCHECK_EQ(this, g_power_monitor); |
g_power_monitor = NULL; |
} |
// static |
PowerMonitor* PowerMonitor::Get() { |
+ AutoLock(g_power_monitor_lock.Get()); |
return g_power_monitor; |
} |
+// static |
+bool PowerMonitor::AddObserverThreadSafe(PowerObserver* observer) { |
+ AutoLock(g_power_monitor_lock.Get()); |
+ if (!g_power_monitor) |
+ return false; |
+ g_power_monitor->RemoveObserver(observer); |
+ return true; |
+} |
+ |
+// static |
+bool PowerMonitor::RemoveObserverThreadSafe(PowerObserver* observer) { |
+ AutoLock(g_power_monitor_lock.Get()); |
+ if (!g_power_monitor) |
+ return false; |
+ g_power_monitor->RemoveObserver(observer); |
+ return true; |
+} |
+ |
void PowerMonitor::AddObserver(PowerObserver* obs) { |
+ g_power_monitor_lock.Get().AssertAcquired(); |
observers_->AddObserver(obs); |
} |
void PowerMonitor::RemoveObserver(PowerObserver* obs) { |
+ g_power_monitor_lock.Get().AssertAcquired(); |
observers_->RemoveObserver(obs); |
} |
@@ -45,16 +77,19 @@ bool PowerMonitor::IsOnBatteryPower() { |
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); |
} |