Commit 012b3711 authored by bajones's avatar bajones Committed by Commit bot

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}
parent 45db74f8
...@@ -448,6 +448,7 @@ component("base") { ...@@ -448,6 +448,7 @@ component("base") {
"power_monitor/power_monitor_device_source_win.cc", "power_monitor/power_monitor_device_source_win.cc",
"power_monitor/power_monitor_source.cc", "power_monitor/power_monitor_source.cc",
"power_monitor/power_monitor_source.h", "power_monitor/power_monitor_source.h",
"power_monitor/power_observer.cc",
"power_monitor/power_observer.h", "power_monitor/power_observer.h",
"process/internal_linux.cc", "process/internal_linux.cc",
"process/internal_linux.h", "process/internal_linux.h",
......
...@@ -439,6 +439,7 @@ ...@@ -439,6 +439,7 @@
'power_monitor/power_monitor_device_source_win.cc', 'power_monitor/power_monitor_device_source_win.cc',
'power_monitor/power_monitor_source.cc', 'power_monitor/power_monitor_source.cc',
'power_monitor/power_monitor_source.h', 'power_monitor/power_monitor_source.h',
'power_monitor/power_observer.cc',
'power_monitor/power_observer.h', 'power_monitor/power_observer.h',
'process/internal_linux.cc', 'process/internal_linux.cc',
'process/internal_linux.h', 'process/internal_linux.h',
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "base/power_monitor/power_monitor.h" #include "base/power_monitor/power_monitor.h"
#include "base/logging.h"
#include "base/power_monitor/power_monitor_source.h" #include "base/power_monitor/power_monitor_source.h"
namespace base { namespace base {
...@@ -27,11 +28,17 @@ PowerMonitor* PowerMonitor::Get() { ...@@ -27,11 +28,17 @@ PowerMonitor* PowerMonitor::Get() {
} }
void PowerMonitor::AddObserver(PowerObserver* obs) { void PowerMonitor::AddObserver(PowerObserver* obs) {
DCHECK(!obs->power_monitor_thread_checker_);
obs->power_monitor_thread_checker_.reset(new base::ThreadChecker());
observers_->AddObserver(obs); observers_->AddObserver(obs);
} }
void PowerMonitor::RemoveObserver(PowerObserver* 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); observers_->RemoveObserver(obs);
obs->power_monitor_thread_checker_.reset();
} }
PowerMonitorSource* PowerMonitor::Source() { PowerMonitorSource* PowerMonitor::Source() {
......
// 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
...@@ -7,14 +7,20 @@ ...@@ -7,14 +7,20 @@
#include "base/base_export.h" #include "base/base_export.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/thread_checker.h"
namespace base { namespace base {
class BASE_EXPORT PowerObserver { class BASE_EXPORT PowerObserver {
friend class PowerMonitor;
public: public:
PowerObserver();
// Notification of a change in power status of the computer, such // Notification of a change in power status of the computer, such
// as from switching between battery and A/C power. // 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. // Notification that the system is suspending.
virtual void OnSuspend() {} virtual void OnSuspend() {}
...@@ -23,7 +29,12 @@ class BASE_EXPORT PowerObserver { ...@@ -23,7 +29,12 @@ class BASE_EXPORT PowerObserver {
virtual void OnResume() {} virtual void OnResume() {}
protected: 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 } // namespace base
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment