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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "device/generic_sensor/platform_sensor_reader_linux.h" 5 #include "device/generic_sensor/platform_sensor_reader_linux.h"
6 6
7 #include "base/files/file_util.h" 7 #include "base/files/file_util.h"
8 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/threading/thread_restrictions.h" 10 #include "base/threading/thread_restrictions.h"
11 #include "base/timer/timer.h" 11 #include "base/timer/timer.h"
12 #include "device/generic_sensor/linux/sensor_data_linux.h" 12 #include "device/generic_sensor/linux/sensor_data_linux.h"
13 #include "device/generic_sensor/platform_sensor_linux.h" 13 #include "device/generic_sensor/platform_sensor_linux.h"
14 #include "device/generic_sensor/public/cpp/sensor_reading.h" 14 #include "device/generic_sensor/public/cpp/sensor_reading.h"
15 15
16 namespace device { 16 namespace device {
17 17
18 class PollingSensorReader : public SensorReader { 18 class PollingSensorReader : public SensorReader {
19 public: 19 public:
20 PollingSensorReader( 20 PollingSensorReader(const SensorInfoLinux* sensor_device,
21 const SensorInfoLinux* sensor_device, 21 scoped_refptr<base::SingleThreadTaskRunner> task_runner);
22 PlatformSensorLinux* sensor,
23 scoped_refptr<base::SingleThreadTaskRunner> polling_task_runner);
24 ~PollingSensorReader() override; 22 ~PollingSensorReader() override;
25 23
26 // SensorReader implements: 24 // SensorReader implements:
27 bool StartFetchingData( 25 void StartFetchingData(
28 const PlatformSensorConfiguration& configuration) override; 26 const PlatformSensorConfiguration& configuration) override;
29 void StopFetchingData() override; 27 void StopFetchingData() override;
30 28
31 private: 29 private:
32 // Initializes a read timer. 30 // Initializes a read timer.
33 void InitializeTimer(const PlatformSensorConfiguration& configuration); 31 void InitializeTimer(const PlatformSensorConfiguration& configuration);
34 32
35 // Polls data and sends it to a |sensor_|. 33 // Polls data and sends it to a |sensor_|.
36 void PollForData(); 34 void PollForData();
37 35
(...skipping 13 matching lines...) Expand all
51 // destructor is called. 49 // destructor is called.
52 base::RepeatingTimer* timer_; 50 base::RepeatingTimer* timer_;
53 51
54 base::WeakPtrFactory<PollingSensorReader> weak_factory_; 52 base::WeakPtrFactory<PollingSensorReader> weak_factory_;
55 53
56 DISALLOW_COPY_AND_ASSIGN(PollingSensorReader); 54 DISALLOW_COPY_AND_ASSIGN(PollingSensorReader);
57 }; 55 };
58 56
59 PollingSensorReader::PollingSensorReader( 57 PollingSensorReader::PollingSensorReader(
60 const SensorInfoLinux* sensor_device, 58 const SensorInfoLinux* sensor_device,
61 PlatformSensorLinux* sensor, 59 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
62 scoped_refptr<base::SingleThreadTaskRunner> polling_task_runner) 60 : SensorReader(std::move(task_runner)),
63 : SensorReader(sensor, polling_task_runner),
64 sensor_file_paths_(sensor_device->device_reading_files), 61 sensor_file_paths_(sensor_device->device_reading_files),
65 scaling_value_(sensor_device->device_scaling_value), 62 scaling_value_(sensor_device->device_scaling_value),
66 offset_value_(sensor_device->device_offset_value), 63 offset_value_(sensor_device->device_offset_value),
67 apply_scaling_func_(sensor_device->apply_scaling_func), 64 apply_scaling_func_(sensor_device->apply_scaling_func),
68 timer_(new base::RepeatingTimer()), 65 timer_(new base::RepeatingTimer()),
69 weak_factory_(this) {} 66 weak_factory_(this) {}
70 67
71 PollingSensorReader::~PollingSensorReader() { 68 PollingSensorReader::~PollingSensorReader() {
72 polling_task_runner_->DeleteSoon(FROM_HERE, timer_); 69 polling_task_runner_->DeleteSoon(FROM_HERE, timer_);
73 } 70 }
74 71
75 bool PollingSensorReader::StartFetchingData( 72 void PollingSensorReader::StartFetchingData(
76 const PlatformSensorConfiguration& configuration) { 73 const PlatformSensorConfiguration& configuration) {
74 DCHECK(polling_task_runner_->BelongsToCurrentThread());
75 DCHECK(sensor_);
77 if (is_reading_active_) 76 if (is_reading_active_)
78 StopFetchingData(); 77 StopFetchingData();
79 78 InitializeTimer(configuration);
80 return polling_task_runner_->PostTask(
81 FROM_HERE, base::Bind(&PollingSensorReader::InitializeTimer,
82 weak_factory_.GetWeakPtr(), configuration));
83 } 79 }
84 80
85 void PollingSensorReader::StopFetchingData() { 81 void PollingSensorReader::StopFetchingData() {
82 DCHECK(polling_task_runner_->BelongsToCurrentThread());
86 is_reading_active_ = false; 83 is_reading_active_ = false;
87 timer_->Stop(); 84 timer_->Stop();
88 } 85 }
89 86
90 void PollingSensorReader::InitializeTimer( 87 void PollingSensorReader::InitializeTimer(
91 const PlatformSensorConfiguration& configuration) { 88 const PlatformSensorConfiguration& configuration) {
92 DCHECK(polling_task_runner_->BelongsToCurrentThread()); 89 DCHECK(polling_task_runner_->BelongsToCurrentThread());
90 DCHECK(!is_reading_active_);
93 timer_->Start(FROM_HERE, base::TimeDelta::FromMicroseconds( 91 timer_->Start(FROM_HERE, base::TimeDelta::FromMicroseconds(
94 base::Time::kMicrosecondsPerSecond / 92 base::Time::kMicrosecondsPerSecond /
95 configuration.frequency()), 93 configuration.frequency()),
96 this, &PollingSensorReader::PollForData); 94 this, &PollingSensorReader::PollForData);
97 is_reading_active_ = true; 95 is_reading_active_ = true;
98 } 96 }
99 97
100 void PollingSensorReader::PollForData() { 98 void PollingSensorReader::PollForData() {
101 DCHECK(polling_task_runner_->BelongsToCurrentThread()); 99 DCHECK(polling_task_runner_->BelongsToCurrentThread());
102 base::ThreadRestrictions::AssertIOAllowed();
103 100
104 SensorReading readings; 101 SensorReading readings;
105 DCHECK_LE(sensor_file_paths_.size(), arraysize(readings.values)); 102 DCHECK_LE(sensor_file_paths_.size(), arraysize(readings.values));
106 int i = 0; 103 int i = 0;
107 for (const auto& path : sensor_file_paths_) { 104 for (const auto& path : sensor_file_paths_) {
108 std::string new_read_value; 105 std::string new_read_value;
109 if (!base::ReadFileToString(path, &new_read_value)) { 106 if (!base::ReadFileToString(path, &new_read_value)) {
110 NotifyReadError(); 107 NotifyReadError();
111 StopFetchingData(); 108 StopFetchingData();
112 return; 109 return;
(...skipping 14 matching lines...) Expand all
127 if (is_reading_active_) { 124 if (is_reading_active_) {
128 task_runner_->PostTask( 125 task_runner_->PostTask(
129 FROM_HERE, base::Bind(&PlatformSensorLinux::UpdatePlatformSensorReading, 126 FROM_HERE, base::Bind(&PlatformSensorLinux::UpdatePlatformSensorReading,
130 base::Unretained(sensor_), readings)); 127 base::Unretained(sensor_), readings));
131 } 128 }
132 } 129 }
133 130
134 // static 131 // static
135 std::unique_ptr<SensorReader> SensorReader::Create( 132 std::unique_ptr<SensorReader> SensorReader::Create(
136 const SensorInfoLinux* sensor_device, 133 const SensorInfoLinux* sensor_device,
137 PlatformSensorLinux* sensor, 134 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
138 scoped_refptr<base::SingleThreadTaskRunner> polling_thread_task_runner) { 135 base::ThreadRestrictions::AssertIOAllowed();
139 // TODO(maksims): implement triggered reading. At the moment, 136 // TODO(maksims): implement triggered reading. At the moment,
140 // only polling read is supported. 137 // only polling read is supported.
141 return base::MakeUnique<PollingSensorReader>(sensor_device, sensor, 138 return base::MakeUnique<PollingSensorReader>(sensor_device,
142 polling_thread_task_runner); 139 std::move(task_runner));
143 } 140 }
144 141
145 SensorReader::SensorReader( 142 SensorReader::SensorReader(
146 PlatformSensorLinux* sensor, 143 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
147 scoped_refptr<base::SingleThreadTaskRunner> polling_task_runner) 144 : 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
148 : sensor_(sensor), 145 polling_task_runner_(base::ThreadTaskRunnerHandle::Get()),
149 polling_task_runner_(polling_task_runner), 146 task_runner_(std::move(task_runner)),
150 task_runner_(base::ThreadTaskRunnerHandle::Get()),
151 is_reading_active_(false) {} 147 is_reading_active_(false) {}
152 148
153 SensorReader::~SensorReader() = default; 149 SensorReader::~SensorReader() = default;
154 150
155 void SensorReader::NotifyReadError() { 151 void SensorReader::NotifyReadError() {
156 if (is_reading_active_) { 152 if (is_reading_active_) {
157 task_runner_->PostTask( 153 task_runner_->PostTask(
158 FROM_HERE, base::Bind(&PlatformSensorLinux::NotifyPlatformSensorError, 154 FROM_HERE, base::Bind(&PlatformSensorLinux::NotifyPlatformSensorError,
159 base::Unretained(sensor_))); 155 base::Unretained(sensor_)));
160 } 156 }
161 } 157 }
162 158
159 void SensorReader::SetPlatformSensorLinux(PlatformSensorLinux* sensor) {
160 DCHECK(!sensor_);
161 sensor_ = sensor;
162 }
163
163 } // namespace device 164 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698