| Index: third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
|
| diff --git a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
|
| index 0e2b58ad38addbb8c7aab354e551476276ce5c0a..483e98fe05b69730cf2f3fc19ca29e54cb093adb 100644
|
| --- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
|
| +++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
|
| @@ -99,8 +99,14 @@ const device::mojom::blink::SensorConfiguration* SensorProxy::defaultConfig()
|
|
|
| void SensorProxy::updateInternalReading() {
|
| DCHECK(isInitialized());
|
| - Reading* reading = static_cast<Reading*>(m_sharedBuffer.get());
|
| - m_reading = *reading;
|
| + int readAttempts = 0;
|
| + const int kMaxReadAttemptsCount = 10;
|
| + while (!tryReadFromBuffer()) {
|
| + if (++readAttempts == kMaxReadAttemptsCount) {
|
| + handleSensorError();
|
| + return;
|
| + }
|
| + }
|
| }
|
|
|
| void SensorProxy::RaiseError() {
|
| @@ -133,8 +139,9 @@ void SensorProxy::onSensorCreated(SensorInitParamsPtr params,
|
| handleSensorError(NotFoundError, "Sensor is not present on the platform.");
|
| return;
|
| }
|
| + const size_t kReadBufferSize = sizeof(ReadingBuffer);
|
|
|
| - DCHECK_EQ(0u, params->buffer_offset % SensorInitParams::kReadBufferSize);
|
| + DCHECK_EQ(0u, params->buffer_offset % kReadBufferSize);
|
|
|
| m_mode = params->mode;
|
| m_defaultConfig = std::move(params->default_configuration);
|
| @@ -148,8 +155,8 @@ void SensorProxy::onSensorCreated(SensorInitParamsPtr params,
|
|
|
| m_sharedBufferHandle = std::move(params->memory);
|
| DCHECK(!m_sharedBuffer);
|
| - m_sharedBuffer = m_sharedBufferHandle->MapAtOffset(
|
| - SensorInitParams::kReadBufferSize, params->buffer_offset);
|
| + m_sharedBuffer =
|
| + m_sharedBufferHandle->MapAtOffset(kReadBufferSize, params->buffer_offset);
|
|
|
| if (!m_sharedBuffer) {
|
| handleSensorError();
|
| @@ -167,4 +174,16 @@ void SensorProxy::onSensorCreated(SensorInitParamsPtr params,
|
| observer->onSensorInitialized();
|
| }
|
|
|
| +bool SensorProxy::tryReadFromBuffer() {
|
| + DCHECK(isInitialized());
|
| + ReadingBuffer* buffer = static_cast<ReadingBuffer*>(m_sharedBuffer.get());
|
| + device::OneWriterSeqLock& seqlock = buffer->seqlock.value();
|
| + auto version = seqlock.ReadBegin();
|
| + auto reading = buffer->reading;
|
| + if (seqlock.ReadRetry(version))
|
| + return false;
|
| + m_reading = reading;
|
| + return true;
|
| +}
|
| +
|
| } // namespace blink
|
|
|