| 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..9a53ba1936003a8161f09974e505b7ba92eeece1 100644
|
| --- a/base/power_monitor/power_monitor.cc
|
| +++ b/base/power_monitor/power_monitor.cc
|
| @@ -3,59 +3,108 @@
|
| // 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 {
|
|
|
| -static PowerMonitor* g_power_monitor = NULL;
|
| +class PowerMonitorImpl;
|
| +
|
| +LazyInstance<Lock>::Leaky g_power_monitor_lock = LAZY_INSTANCE_INITIALIZER;
|
| +static PowerMonitorImpl* g_power_monitor = NULL;
|
| +
|
| +// A class used to monitor the power state change and notify the observers about
|
| +// the change event.
|
| +class BASE_EXPORT PowerMonitorImpl {
|
| + public:
|
| + explicit PowerMonitorImpl(scoped_ptr<PowerMonitorSource> source)
|
| + : observers_(new ObserverListThreadSafe<PowerObserver>()),
|
| + source_(source.Pass()) { }
|
| +
|
| + ~PowerMonitorImpl() { }
|
| +
|
| + scoped_refptr<ObserverListThreadSafe<PowerObserver> > observers_;
|
| + scoped_ptr<PowerMonitorSource> source_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PowerMonitorImpl);
|
| +};
|
|
|
| -PowerMonitor::PowerMonitor(scoped_ptr<PowerMonitorSource> source)
|
| - : observers_(new ObserverListThreadSafe<PowerObserver>()),
|
| - source_(source.Pass()) {
|
| +void PowerMonitor::Initialize(scoped_ptr<PowerMonitorSource> source) {
|
| + AutoLock(g_power_monitor_lock.Get());
|
| DCHECK(!g_power_monitor);
|
| - g_power_monitor = this;
|
| + g_power_monitor = new PowerMonitorImpl(source.Pass());
|
| }
|
|
|
| -PowerMonitor::~PowerMonitor() {
|
| - DCHECK_EQ(this, g_power_monitor);
|
| - g_power_monitor = NULL;
|
| +void PowerMonitor::ShutdownForTesting() {
|
| + AutoLock(g_power_monitor_lock.Get());
|
| + if (g_power_monitor) {
|
| + delete g_power_monitor;
|
| + g_power_monitor = NULL;
|
| + }
|
| }
|
|
|
| -// static
|
| -PowerMonitor* PowerMonitor::Get() {
|
| - return g_power_monitor;
|
| +bool PowerMonitor::IsInitialized() {
|
| + AutoLock(g_power_monitor_lock.Get());
|
| + return g_power_monitor != NULL;
|
| }
|
|
|
| -void PowerMonitor::AddObserver(PowerObserver* obs) {
|
| - observers_->AddObserver(obs);
|
| +bool PowerMonitor::AddObserver(PowerObserver* observer) {
|
| + AutoLock(g_power_monitor_lock.Get());
|
| + if (!g_power_monitor)
|
| + return false;
|
| + g_power_monitor->observers_->AddObserver(observer);
|
| + return true;
|
| }
|
|
|
| -void PowerMonitor::RemoveObserver(PowerObserver* obs) {
|
| - observers_->RemoveObserver(obs);
|
| +bool PowerMonitor::RemoveObserver(PowerObserver* observer) {
|
| + AutoLock(g_power_monitor_lock.Get());
|
| + if (!g_power_monitor)
|
| + return false;
|
| + g_power_monitor->observers_->RemoveObserver(observer);
|
| + return true;
|
| }
|
|
|
| -PowerMonitorSource* PowerMonitor::Source() {
|
| - return source_.get();
|
| +bool PowerMonitor::IsOnBatteryPower() {
|
| + g_power_monitor_lock.Get().AssertAcquired();
|
| + if (!g_power_monitor)
|
| + return false;
|
| + return g_power_monitor->source_->IsOnBatteryPower();
|
| }
|
|
|
| -bool PowerMonitor::IsOnBatteryPower() {
|
| - return source_->IsOnBatteryPower();
|
| +Lock* PowerMonitor::GetLock() {
|
| + return &g_power_monitor_lock.Get();
|
| +}
|
| +
|
| +bool PowerMonitor::IsInitializedLocked() {
|
| + g_power_monitor_lock.Get().AssertAcquired();
|
| + return g_power_monitor != NULL;
|
| +}
|
| +
|
| +PowerMonitorSource* PowerMonitor::GetSource() {
|
| + g_power_monitor_lock.Get().AssertAcquired();
|
| + return g_power_monitor->source_.get();
|
| }
|
|
|
| void PowerMonitor::NotifyPowerStateChange(bool battery_in_use) {
|
| DVLOG(1) << "PowerStateChange: " << (battery_in_use ? "On" : "Off")
|
| << " battery";
|
| - observers_->Notify(&PowerObserver::OnPowerStateChange, battery_in_use);
|
| + g_power_monitor_lock.Get().AssertAcquired();
|
| + g_power_monitor->observers_->Notify(&PowerObserver::OnPowerStateChange,
|
| + battery_in_use);
|
| }
|
|
|
| void PowerMonitor::NotifySuspend() {
|
| DVLOG(1) << "Power Suspending";
|
| - observers_->Notify(&PowerObserver::OnSuspend);
|
| + g_power_monitor_lock.Get().AssertAcquired();
|
| + g_power_monitor->observers_->Notify(&PowerObserver::OnSuspend);
|
| }
|
|
|
| void PowerMonitor::NotifyResume() {
|
| DVLOG(1) << "Power Resuming";
|
| - observers_->Notify(&PowerObserver::OnResume);
|
| + g_power_monitor_lock.Get().AssertAcquired();
|
| + g_power_monitor->observers_->Notify(&PowerObserver::OnResume);
|
| }
|
|
|
| } // namespace base
|
|
|