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(); |