| 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 be0321dbded63426673baa7397231115a552cd72..513b0030629e6cdd8257b99460d3ba38953119a7 100644
|
| --- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
|
| +++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
|
| @@ -101,8 +101,29 @@ const device::mojom::blink::SensorConfiguration* SensorProxy::defaultConfig()
|
|
|
| void SensorProxy::updateInternalReading() {
|
| DCHECK(isInitialized());
|
| - Reading* reading = static_cast<Reading*>(m_sharedBuffer.get());
|
| - m_reading = *reading;
|
| +
|
| + ReadingBuffer* readingBuffer =
|
| + static_cast<ReadingBuffer*>(m_sharedBuffer.get());
|
| + if (readingBuffer->data.timestamp == 0.0) {
|
| + // Shared buffer has not yet been updated.
|
| + // TODO(Mikhail): Should we schedule another update?
|
| + return;
|
| + }
|
| +
|
| + device::OneWriterSeqLock& seqlock = readingBuffer->seqlock;
|
| +
|
| + base::subtle::Atomic32 version;
|
| + Reading reading;
|
| + int readAttempts = 0;
|
| + const int kMaxReadAttemptsCount = 3;
|
| + do {
|
| + version = seqlock.ReadBegin();
|
| + reading = readingBuffer->data;
|
| + if (++readAttempts == kMaxReadAttemptsCount)
|
| + return;
|
| + } while (seqlock.ReadRetry(version));
|
| +
|
| + m_reading = reading;
|
| }
|
|
|
| void SensorProxy::RaiseError() {
|
| @@ -133,8 +154,9 @@ void SensorProxy::onSensorCreated(SensorInitParamsPtr params,
|
| handleSensorError();
|
| 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 +170,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();
|
|
|