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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/sensor/SensorProxy.h" 5 #include "modules/sensor/SensorProxy.h"
6 6
7 #include "core/frame/LocalFrame.h" 7 #include "core/frame/LocalFrame.h"
8 #include "modules/sensor/SensorProviderProxy.h" 8 #include "modules/sensor/SensorProviderProxy.h"
9 #include "platform/mojo/MojoHelper.h" 9 #include "platform/mojo/MojoHelper.h"
10 10
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 } 94 }
95 95
96 const device::mojom::blink::SensorConfiguration* SensorProxy::defaultConfig() 96 const device::mojom::blink::SensorConfiguration* SensorProxy::defaultConfig()
97 const { 97 const {
98 DCHECK(isInitialized()); 98 DCHECK(isInitialized());
99 return m_defaultConfig.get(); 99 return m_defaultConfig.get();
100 } 100 }
101 101
102 void SensorProxy::updateInternalReading() { 102 void SensorProxy::updateInternalReading() {
103 DCHECK(isInitialized()); 103 DCHECK(isInitialized());
104 Reading* reading = static_cast<Reading*>(m_sharedBuffer.get()); 104
105 m_reading = *reading; 105 ReadingBuffer* readingBuffer =
106 static_cast<ReadingBuffer*>(m_sharedBuffer.get());
107 if (readingBuffer->data.timestamp == 0.0) {
108 // Shared buffer has not yet been updated.
109 // TODO(Mikhail): Should we schedule another update?
110 return;
111 }
112
113 device::OneWriterSeqLock& seqlock = readingBuffer->seqlock;
114
115 base::subtle::Atomic32 version;
116 Reading reading;
117 int readAttempts = 0;
118 const int kMaxReadAttemptsCount = 3;
119 do {
120 version = seqlock.ReadBegin();
121 reading = readingBuffer->data;
122 if (++readAttempts == kMaxReadAttemptsCount)
123 return;
124 } while (seqlock.ReadRetry(version));
125
126 m_reading = reading;
106 } 127 }
107 128
108 void SensorProxy::RaiseError() { 129 void SensorProxy::RaiseError() {
109 handleSensorError(); 130 handleSensorError();
110 } 131 }
111 132
112 void SensorProxy::SensorReadingChanged() { 133 void SensorProxy::SensorReadingChanged() {
113 for (Observer* observer : m_observers) 134 for (Observer* observer : m_observers)
114 observer->onSensorReadingChanged(); 135 observer->onSensorReadingChanged();
115 } 136 }
(...skipping 10 matching lines...) Expand all
126 observer->onSensorError(); 147 observer->onSensorError();
127 } 148 }
128 149
129 void SensorProxy::onSensorCreated(SensorInitParamsPtr params, 150 void SensorProxy::onSensorCreated(SensorInitParamsPtr params,
130 SensorClientRequest clientRequest) { 151 SensorClientRequest clientRequest) {
131 DCHECK_EQ(Initializing, m_state); 152 DCHECK_EQ(Initializing, m_state);
132 if (!params) { 153 if (!params) {
133 handleSensorError(); 154 handleSensorError();
134 return; 155 return;
135 } 156 }
157 const size_t kReadBufferSize = sizeof(ReadingBuffer);
136 158
137 DCHECK_EQ(0u, params->buffer_offset % SensorInitParams::kReadBufferSize); 159 DCHECK_EQ(0u, params->buffer_offset % kReadBufferSize);
138 160
139 m_mode = params->mode; 161 m_mode = params->mode;
140 m_defaultConfig = std::move(params->default_configuration); 162 m_defaultConfig = std::move(params->default_configuration);
141 if (!m_defaultConfig) { 163 if (!m_defaultConfig) {
142 handleSensorError(); 164 handleSensorError();
143 return; 165 return;
144 } 166 }
145 167
146 DCHECK(m_sensor.is_bound()); 168 DCHECK(m_sensor.is_bound());
147 m_clientBinding.Bind(std::move(clientRequest)); 169 m_clientBinding.Bind(std::move(clientRequest));
148 170
149 m_sharedBufferHandle = std::move(params->memory); 171 m_sharedBufferHandle = std::move(params->memory);
150 DCHECK(!m_sharedBuffer); 172 DCHECK(!m_sharedBuffer);
151 m_sharedBuffer = m_sharedBufferHandle->MapAtOffset( 173 m_sharedBuffer =
152 SensorInitParams::kReadBufferSize, params->buffer_offset); 174 m_sharedBufferHandle->MapAtOffset(kReadBufferSize, params->buffer_offset);
153 175
154 if (!m_sharedBuffer) { 176 if (!m_sharedBuffer) {
155 handleSensorError(); 177 handleSensorError();
156 return; 178 return;
157 } 179 }
158 180
159 m_state = Initialized; 181 m_state = Initialized;
160 for (Observer* observer : m_observers) 182 for (Observer* observer : m_observers)
161 observer->onSensorInitialized(); 183 observer->onSensorInitialized();
162 } 184 }
163 185
164 } // namespace blink 186 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698