Index: device/generic_sensor/platform_sensor.cc |
diff --git a/device/generic_sensor/platform_sensor.cc b/device/generic_sensor/platform_sensor.cc |
index bca1fae37f9c6f07d63bd4c62d14b50c622839be..a9b2604bb3c9b11b705ca0a38ad3a58b8279a99c 100644 |
--- a/device/generic_sensor/platform_sensor.cc |
+++ b/device/generic_sensor/platform_sensor.cc |
@@ -6,6 +6,7 @@ |
#include <utility> |
+#include "base/threading/thread_task_runner_handle.h" |
#include "device/generic_sensor/platform_sensor_provider.h" |
#include "device/generic_sensor/public/cpp/platform_sensor_configuration.h" |
@@ -14,7 +15,8 @@ namespace device { |
PlatformSensor::PlatformSensor(mojom::SensorType type, |
mojo::ScopedSharedBufferMapping mapping, |
PlatformSensorProvider* provider) |
- : shared_buffer_mapping_(std::move(mapping)), |
+ : task_runner_(base::ThreadTaskRunnerHandle::Get()), |
+ shared_buffer_mapping_(std::move(mapping)), |
type_(type), |
provider_(provider), |
weak_factory_(this) {} |
@@ -80,6 +82,21 @@ void PlatformSensor::RemoveClient(Client* client) { |
} |
} |
+void PlatformSensor::UpdateSensorReading(const SensorReading& reading, |
+ bool notify_clients) { |
+ ReadingBuffer* buffer = |
+ static_cast<ReadingBuffer*>(shared_buffer_mapping_.get()); |
+ auto& seqlock = buffer->seqlock.value(); |
+ seqlock.WriteBegin(); |
+ buffer->reading = reading; |
+ seqlock.WriteEnd(); |
+ |
+ if (notify_clients) |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&PlatformSensor::NotifySensorReadingChanged, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
void PlatformSensor::NotifySensorReadingChanged() { |
using ClientsList = decltype(clients_); |
ClientsList::Iterator it(&clients_); |