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

Unified Diff: third_party/WebKit/Source/modules/sensor/SensorProxy.cpp

Issue 2395853003: [Sensors] Improvements in shared buffer managing (Closed)
Patch Set: Created 4 years, 2 months 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 side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698