| 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 |