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

Unified Diff: device/generic_sensor/platform_sensor_reader_linux.cc

Issue 2569763004: [sensors](Linux) Fix tsan data race in sensor reader (Closed)
Patch Set: modify code comments Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: device/generic_sensor/platform_sensor_reader_linux.cc
diff --git a/device/generic_sensor/platform_sensor_reader_linux.cc b/device/generic_sensor/platform_sensor_reader_linux.cc
index 5c014a4b200b43b9f8697bcfa8c5ee1cfc457fb9..e0d3cc8e40e2e4e327882338057ea2c38baaadef 100644
--- a/device/generic_sensor/platform_sensor_reader_linux.cc
+++ b/device/generic_sensor/platform_sensor_reader_linux.cc
@@ -17,14 +17,12 @@ namespace device {
class PollingSensorReader : public SensorReader {
public:
- PollingSensorReader(
- const SensorInfoLinux* sensor_device,
- PlatformSensorLinux* sensor,
- scoped_refptr<base::SingleThreadTaskRunner> polling_task_runner);
+ PollingSensorReader(const SensorInfoLinux* sensor_device,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~PollingSensorReader() override;
// SensorReader implements:
- bool StartFetchingData(
+ void StartFetchingData(
const PlatformSensorConfiguration& configuration) override;
void StopFetchingData() override;
@@ -58,9 +56,8 @@ class PollingSensorReader : public SensorReader {
PollingSensorReader::PollingSensorReader(
const SensorInfoLinux* sensor_device,
- PlatformSensorLinux* sensor,
- scoped_refptr<base::SingleThreadTaskRunner> polling_task_runner)
- : SensorReader(sensor, polling_task_runner),
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+ : SensorReader(std::move(task_runner)),
sensor_file_paths_(sensor_device->device_reading_files),
scaling_value_(sensor_device->device_scaling_value),
offset_value_(sensor_device->device_offset_value),
@@ -72,17 +69,17 @@ PollingSensorReader::~PollingSensorReader() {
polling_task_runner_->DeleteSoon(FROM_HERE, timer_);
}
-bool PollingSensorReader::StartFetchingData(
+void PollingSensorReader::StartFetchingData(
const PlatformSensorConfiguration& configuration) {
+ DCHECK(polling_task_runner_->BelongsToCurrentThread());
+ DCHECK(sensor_);
if (is_reading_active_)
StopFetchingData();
-
- return polling_task_runner_->PostTask(
- FROM_HERE, base::Bind(&PollingSensorReader::InitializeTimer,
- weak_factory_.GetWeakPtr(), configuration));
+ InitializeTimer(configuration);
}
void PollingSensorReader::StopFetchingData() {
+ DCHECK(polling_task_runner_->BelongsToCurrentThread());
is_reading_active_ = false;
timer_->Stop();
}
@@ -90,6 +87,7 @@ void PollingSensorReader::StopFetchingData() {
void PollingSensorReader::InitializeTimer(
const PlatformSensorConfiguration& configuration) {
DCHECK(polling_task_runner_->BelongsToCurrentThread());
+ DCHECK(!is_reading_active_);
timer_->Start(FROM_HERE, base::TimeDelta::FromMicroseconds(
base::Time::kMicrosecondsPerSecond /
configuration.frequency()),
@@ -99,7 +97,6 @@ void PollingSensorReader::InitializeTimer(
void PollingSensorReader::PollForData() {
DCHECK(polling_task_runner_->BelongsToCurrentThread());
- base::ThreadRestrictions::AssertIOAllowed();
SensorReading readings;
DCHECK_LE(sensor_file_paths_.size(), arraysize(readings.values));
@@ -134,20 +131,19 @@ void PollingSensorReader::PollForData() {
// static
std::unique_ptr<SensorReader> SensorReader::Create(
const SensorInfoLinux* sensor_device,
- PlatformSensorLinux* sensor,
- scoped_refptr<base::SingleThreadTaskRunner> polling_thread_task_runner) {
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+ base::ThreadRestrictions::AssertIOAllowed();
// TODO(maksims): implement triggered reading. At the moment,
// only polling read is supported.
- return base::MakeUnique<PollingSensorReader>(sensor_device, sensor,
- polling_thread_task_runner);
+ return base::MakeUnique<PollingSensorReader>(sensor_device,
+ std::move(task_runner));
}
SensorReader::SensorReader(
- PlatformSensorLinux* sensor,
- scoped_refptr<base::SingleThreadTaskRunner> polling_task_runner)
- : sensor_(sensor),
- polling_task_runner_(polling_task_runner),
- task_runner_(base::ThreadTaskRunnerHandle::Get()),
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+ : sensor_(nullptr),
Reilly Grant (use Gerrit) 2016/12/14 18:56:08 Why do we no longer pass this through the construc
Mikhail 2016/12/15 10:57:48 think, we could pass callback closures instead of
maksims (do not use this acc) 2016/12/16 08:39:22 Yep, we'll pass callbacks along with a task runner
+ polling_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+ task_runner_(std::move(task_runner)),
is_reading_active_(false) {}
SensorReader::~SensorReader() = default;
@@ -160,4 +156,9 @@ void SensorReader::NotifyReadError() {
}
}
+void SensorReader::SetPlatformSensorLinux(PlatformSensorLinux* sensor) {
+ DCHECK(!sensor_);
+ sensor_ = sensor;
+}
+
} // namespace device

Powered by Google App Engine
This is Rietveld 408576698