Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: base/power_monitor/power_monitor.cc

Issue 179923006: Attempting to resolve a race condition with PowerMonitor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Refactored to a more explicitly singleton-like style. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/power_monitor/power_monitor.h ('k') | base/power_monitor/power_monitor_source.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/power_monitor/power_monitor.h" 5 #include "base/power_monitor/power_monitor.h"
6
7 #include "base/lazy_instance.h"
6 #include "base/power_monitor/power_monitor_source.h" 8 #include "base/power_monitor/power_monitor_source.h"
9 #include "base/synchronization/lock.h"
7 10
8 namespace base { 11 namespace base {
9 12
13 LazyInstance<Lock>::Leaky g_power_monitor_lock = LAZY_INSTANCE_INITIALIZER;
10 static PowerMonitor* g_power_monitor = NULL; 14 static PowerMonitor* g_power_monitor = NULL;
11 15
16 void PowerMonitor::Initialize(scoped_ptr<PowerMonitorSource> source) {
17 AutoLock(g_power_monitor_lock.Get());
18 DCHECK(!g_power_monitor);
19 g_power_monitor = new PowerMonitor(source.Pass());
20 }
21
22 void PowerMonitor::Shutdown() {
23 AutoLock(g_power_monitor_lock.Get());
24 if (g_power_monitor) {
25 delete g_power_monitor;
26 g_power_monitor = NULL;
27 }
28 }
29
30 bool PowerMonitor::IsInitialized() {
31 AutoLock(g_power_monitor_lock.Get());
32 return g_power_monitor != NULL;
33 }
34
35 bool PowerMonitor::AddObserver(PowerObserver* observer) {
36 AutoLock(g_power_monitor_lock.Get());
37 if (!g_power_monitor)
38 return false;
Ken Russell (switch to Gerrit) 2014/02/28 21:30:09 Maybe this, RemoveObserver and IsOnBatteryPower sh
39 g_power_monitor->AddObserverImpl(observer);
40 return true;
41 }
42
43 bool PowerMonitor::RemoveObserver(PowerObserver* observer) {
44 AutoLock(g_power_monitor_lock.Get());
45 if (!g_power_monitor)
46 return false;
47 g_power_monitor->RemoveObserverImpl(observer);
48 return true;
49 }
50
51 bool PowerMonitor::IsOnBatteryPower() {
52 AutoLock(g_power_monitor_lock.Get());
53 if (!g_power_monitor)
54 return false;
55 return g_power_monitor->IsOnBatteryPowerImpl();
56 }
57
12 PowerMonitor::PowerMonitor(scoped_ptr<PowerMonitorSource> source) 58 PowerMonitor::PowerMonitor(scoped_ptr<PowerMonitorSource> source)
13 : observers_(new ObserverListThreadSafe<PowerObserver>()), 59 : observers_(new ObserverListThreadSafe<PowerObserver>()),
14 source_(source.Pass()) { 60 source_(source.Pass()) {
15 DCHECK(!g_power_monitor);
16 g_power_monitor = this;
17 } 61 }
18 62
19 PowerMonitor::~PowerMonitor() { 63 PowerMonitor::~PowerMonitor() {
20 DCHECK_EQ(this, g_power_monitor);
21 g_power_monitor = NULL;
22 } 64 }
23 65
24 // static 66 Lock* PowerMonitor::GetSingletonLock() { return &g_power_monitor_lock.Get(); }
25 PowerMonitor* PowerMonitor::Get() { 67
68 PowerMonitor* PowerMonitor::GetSingleton() {
69 g_power_monitor_lock.Get().AssertAcquired();
26 return g_power_monitor; 70 return g_power_monitor;
27 } 71 }
28 72
29 void PowerMonitor::AddObserver(PowerObserver* obs) { 73 void PowerMonitor::AddObserverImpl(PowerObserver* obs) {
74 g_power_monitor_lock.Get().AssertAcquired();
30 observers_->AddObserver(obs); 75 observers_->AddObserver(obs);
31 } 76 }
32 77
33 void PowerMonitor::RemoveObserver(PowerObserver* obs) { 78 void PowerMonitor::RemoveObserverImpl(PowerObserver* obs) {
79 g_power_monitor_lock.Get().AssertAcquired();
34 observers_->RemoveObserver(obs); 80 observers_->RemoveObserver(obs);
35 } 81 }
36 82
37 PowerMonitorSource* PowerMonitor::Source() { 83 bool PowerMonitor::IsOnBatteryPowerImpl() {
38 return source_.get(); 84 g_power_monitor_lock.Get().AssertAcquired();
85 return source_->IsOnBatteryPower();
39 } 86 }
40 87
41 bool PowerMonitor::IsOnBatteryPower() { 88 PowerMonitorSource* PowerMonitor::Source() { return source_.get(); }
42 return source_->IsOnBatteryPower();
43 }
44 89
45 void PowerMonitor::NotifyPowerStateChange(bool battery_in_use) { 90 void PowerMonitor::NotifyPowerStateChange(bool battery_in_use) {
46 DVLOG(1) << "PowerStateChange: " << (battery_in_use ? "On" : "Off") 91 DVLOG(1) << "PowerStateChange: " << (battery_in_use ? "On" : "Off")
47 << " battery"; 92 << " battery";
93 AutoLock(g_power_monitor_lock.Get());
48 observers_->Notify(&PowerObserver::OnPowerStateChange, battery_in_use); 94 observers_->Notify(&PowerObserver::OnPowerStateChange, battery_in_use);
49 } 95 }
50 96
51 void PowerMonitor::NotifySuspend() { 97 void PowerMonitor::NotifySuspend() {
52 DVLOG(1) << "Power Suspending"; 98 DVLOG(1) << "Power Suspending";
99 AutoLock(g_power_monitor_lock.Get());
53 observers_->Notify(&PowerObserver::OnSuspend); 100 observers_->Notify(&PowerObserver::OnSuspend);
54 } 101 }
55 102
56 void PowerMonitor::NotifyResume() { 103 void PowerMonitor::NotifyResume() {
57 DVLOG(1) << "Power Resuming"; 104 DVLOG(1) << "Power Resuming";
105 AutoLock(g_power_monitor_lock.Get());
58 observers_->Notify(&PowerObserver::OnResume); 106 observers_->Notify(&PowerObserver::OnResume);
59 } 107 }
60 108
61 } // namespace base 109 } // namespace base
OLDNEW
« no previous file with comments | « base/power_monitor/power_monitor.h ('k') | base/power_monitor/power_monitor_source.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698