Commit 37a55497 authored by Harvey Yang's avatar Harvey Yang Committed by Chromium LUCI CQ

accelerometer: Refactor AccelerometerProviderMojo

This commit simplifies the logic of AccelerometerProviderMojo by
limiting the usages on the UI thread.

BUG=b:175355860
TEST=unit tests and run on kohaku(hatch)

Change-Id: Ic43439a70b544848dcd3a948f996f81a9032687d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2586172Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Commit-Queue: Cheng-Hao Yang <chenghaoyang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#839061}
parent b4c95a46
...@@ -30,12 +30,10 @@ constexpr base::TimeDelta kDelayReconnect = ...@@ -30,12 +30,10 @@ constexpr base::TimeDelta kDelayReconnect =
} // namespace } // namespace
AccelerometerProviderMojo::AccelerometerProviderMojo() AccelerometerProviderMojo::AccelerometerProviderMojo()
: sensor_hal_client_(this), : update_(new AccelerometerUpdate()) {}
observers_(
new base::ObserverListThreadSafe<AccelerometerReader::Observer>()),
update_(new AccelerometerUpdate()) {}
void AccelerometerProviderMojo::PrepareAndInitialize() { void AccelerometerProviderMojo::PrepareAndInitialize() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// This function should only be called once. // This function should only be called once.
DCHECK(!task_runner_); DCHECK(!task_runner_);
...@@ -49,40 +47,50 @@ void AccelerometerProviderMojo::PrepareAndInitialize() { ...@@ -49,40 +47,50 @@ void AccelerometerProviderMojo::PrepareAndInitialize() {
void AccelerometerProviderMojo::AddObserver( void AccelerometerProviderMojo::AddObserver(
AccelerometerReader::Observer* observer) { AccelerometerReader::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(task_runner_); DCHECK(task_runner_);
// Do not move this into AddObserverOnThread, as the current task runner will observers_.AddObserver(observer);
// be used in ObserverListThreadSafe::Notify.
observers_->AddObserver(observer);
task_runner_->PostNonNestableTask( one_time_read_ = true;
FROM_HERE, base::BindOnce(&AccelerometerProviderMojo::AddObserverOnThread,
base::Unretained(this), observer)); if (accelerometer_read_on_)
return;
for (auto& accelerometer : accelerometers_) {
if (!accelerometer.second.samples_observer.get())
continue;
accelerometer.second.samples_observer->SetEnabled(true);
}
} }
void AccelerometerProviderMojo::RemoveObserver( void AccelerometerProviderMojo::RemoveObserver(
AccelerometerReader::Observer* observer) { AccelerometerReader::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(task_runner_); DCHECK(task_runner_);
observers_->RemoveObserver(observer); observers_.RemoveObserver(observer);
} }
void AccelerometerProviderMojo::StartListenToTabletModeController() { void AccelerometerProviderMojo::StartListenToTabletModeController() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Shell::Get()->tablet_mode_controller()->AddObserver(this); Shell::Get()->tablet_mode_controller()->AddObserver(this);
} }
void AccelerometerProviderMojo::StopListenToTabletModeController() { void AccelerometerProviderMojo::StopListenToTabletModeController() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Shell::Get()->tablet_mode_controller()->RemoveObserver(this); Shell::Get()->tablet_mode_controller()->RemoveObserver(this);
} }
void AccelerometerProviderMojo::SetEmitEvents(bool emit_events) { void AccelerometerProviderMojo::SetEmitEvents(bool emit_events) {
task_runner_->PostNonNestableTask( DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
FROM_HERE, emit_events_ = emit_events;
base::BindOnce(&AccelerometerProviderMojo::SetEmitEventsOnThread, this,
emit_events));
} }
void AccelerometerProviderMojo::OnTabletPhysicalStateChanged() { void AccelerometerProviderMojo::OnTabletPhysicalStateChanged() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Wait until the existence of the driver is determined. // Wait until the existence of the driver is determined.
if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::UNKNOWN) { if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::UNKNOWN) {
pending_on_tablet_physical_state_changed_ = true; pending_on_tablet_physical_state_changed_ = true;
...@@ -514,9 +522,9 @@ void AccelerometerProviderMojo::OnSampleUpdatedCallback( ...@@ -514,9 +522,9 @@ void AccelerometerProviderMojo::OnSampleUpdatedCallback(
return; return;
} }
observers_->Notify(FROM_HERE, for (auto& observer : observers_)
&AccelerometerReader::Observer::OnAccelerometerUpdated, observer.OnAccelerometerUpdated(update_);
update_);
update_ = new AccelerometerUpdate(); update_ = new AccelerometerUpdate();
one_time_read_ = false; one_time_read_ = false;
...@@ -532,12 +540,8 @@ void AccelerometerProviderMojo::OnSampleUpdatedCallback( ...@@ -532,12 +540,8 @@ void AccelerometerProviderMojo::OnSampleUpdatedCallback(
} }
} }
void AccelerometerProviderMojo::SetEmitEventsOnThread(bool emit_events) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
emit_events_ = emit_events;
}
void AccelerometerProviderMojo::FailedToInitialize() { void AccelerometerProviderMojo::FailedToInitialize() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_NE(initialization_state_, State::SUCCESS); DCHECK_NE(initialization_state_, State::SUCCESS);
LOG(ERROR) << "Failed to initialize for accelerometer read."; LOG(ERROR) << "Failed to initialize for accelerometer read.";
...@@ -548,21 +552,4 @@ void AccelerometerProviderMojo::FailedToInitialize() { ...@@ -548,21 +552,4 @@ void AccelerometerProviderMojo::FailedToInitialize() {
sensor_hal_client_.reset(); sensor_hal_client_.reset();
} }
void AccelerometerProviderMojo::AddObserverOnThread(
AccelerometerReader::Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
one_time_read_ = true;
if (accelerometer_read_on_)
return;
for (auto& accelerometer : accelerometers_) {
if (!accelerometer.second.samples_observer.get())
continue;
accelerometer.second.samples_observer->SetEnabled(true);
}
}
} // namespace ash } // namespace ash
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "ash/ash_export.h" #include "ash/ash_export.h"
#include "ash/public/cpp/tablet_mode_observer.h" #include "ash/public/cpp/tablet_mode_observer.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/observer_list_threadsafe.h" #include "base/observer_list.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/sequence_checker.h" #include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
...@@ -121,18 +121,15 @@ class ASH_EXPORT AccelerometerProviderMojo ...@@ -121,18 +121,15 @@ class ASH_EXPORT AccelerometerProviderMojo
// Called by |observers_|, containing a sample of the accelerometer. // Called by |observers_|, containing a sample of the accelerometer.
void OnSampleUpdatedCallback(int iio_device_id, std::vector<float> sample); void OnSampleUpdatedCallback(int iio_device_id, std::vector<float> sample);
void SetEmitEventsOnThread(bool emit_events);
// Sets FAILED to |initialization_state_| due to an error. // Sets FAILED to |initialization_state_| due to an error.
void FailedToInitialize(); void FailedToInitialize();
void AddObserverOnThread(AccelerometerReader::Observer* observer);
// The task runner to use for blocking tasks. // The task runner to use for blocking tasks.
scoped_refptr<base::SequencedTaskRunner> task_runner_; scoped_refptr<base::SequencedTaskRunner> task_runner_;
// The Mojo channel connecting to Sensor Hal Dispatcher. // The Mojo channel connecting to Sensor Hal Dispatcher.
mojo::Receiver<chromeos::sensors::mojom::SensorHalClient> sensor_hal_client_; mojo::Receiver<chromeos::sensors::mojom::SensorHalClient> sensor_hal_client_{
this};
// The Mojo channel to query and request for devices. // The Mojo channel to query and request for devices.
mojo::Remote<chromeos::sensors::mojom::SensorService> sensor_service_remote_; mojo::Remote<chromeos::sensors::mojom::SensorService> sensor_service_remote_;
...@@ -152,7 +149,7 @@ class ASH_EXPORT AccelerometerProviderMojo ...@@ -152,7 +149,7 @@ class ASH_EXPORT AccelerometerProviderMojo
// |ec_lid_angle_driver_status_| is set. // |ec_lid_angle_driver_status_| is set.
bool pending_on_tablet_physical_state_changed_ = false; bool pending_on_tablet_physical_state_changed_ = false;
// One time read upon |AddObserverOnThread|. // One time read upon |AddObserver|.
// Some observers need to know ECLidAngleDriverStatus, and it's guaranteed to // Some observers need to know ECLidAngleDriverStatus, and it's guaranteed to
// be set before reading samples. When adding an observer, trigger at least // be set before reading samples. When adding an observer, trigger at least
// one sample to notify observers that ECLidAngleDriverStatus has been set. // one sample to notify observers that ECLidAngleDriverStatus has been set.
...@@ -164,8 +161,7 @@ class ASH_EXPORT AccelerometerProviderMojo ...@@ -164,8 +161,7 @@ class ASH_EXPORT AccelerometerProviderMojo
bool emit_events_ = true; bool emit_events_ = true;
// The observers to notify of accelerometer updates. // The observers to notify of accelerometer updates.
scoped_refptr<base::ObserverListThreadSafe<AccelerometerReader::Observer>> base::ObserverList<AccelerometerReader::Observer>::Unchecked observers_;
observers_;
// The last seen accelerometer data. // The last seen accelerometer data.
scoped_refptr<AccelerometerUpdate> update_; scoped_refptr<AccelerometerUpdate> update_;
......
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