diff options
author | bajones <bajones@chromium.org> | 2014-09-03 17:11:05 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-04 00:34:41 +0000 |
commit | 012b3711f9b51af158598adc2f65e8b667f975a3 (patch) | |
tree | f1b7c8bdcf41416a10dd98729f5ea669c31e338e /base/power_monitor | |
parent | 45db74f875d668805afad8e73b7840e9df9c3215 (diff) | |
download | chromium_src-012b3711f9b51af158598adc2f65e8b667f975a3.zip chromium_src-012b3711f9b51af158598adc2f65e8b667f975a3.tar.gz chromium_src-012b3711f9b51af158598adc2f65e8b667f975a3.tar.bz2 |
Check to ensure PowerObservers are added and removed on the same thread
This behavior is required by ObserverListThreadSafe and may leads to crashes if not followed
BUG=404767
Review URL: https://codereview.chromium.org/502003003
Cr-Commit-Position: refs/heads/master@{#293230}
Diffstat (limited to 'base/power_monitor')
-rw-r--r-- | base/power_monitor/power_monitor.cc | 7 | ||||
-rw-r--r-- | base/power_monitor/power_observer.cc | 15 | ||||
-rw-r--r-- | base/power_monitor/power_observer.h | 15 |
3 files changed, 35 insertions, 2 deletions
diff --git a/base/power_monitor/power_monitor.cc b/base/power_monitor/power_monitor.cc index 14dc4b5..547318e 100644 --- a/base/power_monitor/power_monitor.cc +++ b/base/power_monitor/power_monitor.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/power_monitor/power_monitor.h" +#include "base/logging.h" #include "base/power_monitor/power_monitor_source.h" namespace base { @@ -27,11 +28,17 @@ PowerMonitor* PowerMonitor::Get() { } void PowerMonitor::AddObserver(PowerObserver* obs) { + DCHECK(!obs->power_monitor_thread_checker_); + obs->power_monitor_thread_checker_.reset(new base::ThreadChecker()); observers_->AddObserver(obs); } void PowerMonitor::RemoveObserver(PowerObserver* obs) { + // PowerObservers must be removed on the same thread on which they were added. + DCHECK(obs->power_monitor_thread_checker_); + DCHECK(obs->power_monitor_thread_checker_->CalledOnValidThread()); observers_->RemoveObserver(obs); + obs->power_monitor_thread_checker_.reset(); } PowerMonitorSource* PowerMonitor::Source() { diff --git a/base/power_monitor/power_observer.cc b/base/power_monitor/power_observer.cc new file mode 100644 index 0000000..2642809 --- /dev/null +++ b/base/power_monitor/power_observer.cc @@ -0,0 +1,15 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/power_monitor/power_observer.h" + +namespace base { + +PowerObserver::PowerObserver() { +} + +PowerObserver::~PowerObserver() { +} + +} // namespace base diff --git a/base/power_monitor/power_observer.h b/base/power_monitor/power_observer.h index 6be70bb..e7d40a3 100644 --- a/base/power_monitor/power_observer.h +++ b/base/power_monitor/power_observer.h @@ -7,14 +7,20 @@ #include "base/base_export.h" #include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "base/threading/thread_checker.h" namespace base { class BASE_EXPORT PowerObserver { + friend class PowerMonitor; + public: + PowerObserver(); + // Notification of a change in power status of the computer, such // as from switching between battery and A/C power. - virtual void OnPowerStateChange(bool on_battery_power) {}; + virtual void OnPowerStateChange(bool on_battery_power) {} // Notification that the system is suspending. virtual void OnSuspend() {} @@ -23,7 +29,12 @@ class BASE_EXPORT PowerObserver { virtual void OnResume() {} protected: - virtual ~PowerObserver() {} + virtual ~PowerObserver(); + + private: + // Allows PowerMonitor to ensure this observer is added and removed + // from the same thread, which is required by the ObserverListThreadSafe. + scoped_ptr<base::ThreadChecker> power_monitor_thread_checker_; }; } // namespace base |