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