OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |