Chromium Code Reviews| Index: device/generic_sensor/platform_sensor_provider_base.cc |
| diff --git a/device/generic_sensor/platform_sensor_provider_base.cc b/device/generic_sensor/platform_sensor_provider_base.cc |
| index 51c60ac5ae25e681cefa83ed2cdec325ee9d9ccc..4da0723ededfe230d38241b8318b9cdf8d9db6f1 100644 |
| --- a/device/generic_sensor/platform_sensor_provider_base.cc |
| +++ b/device/generic_sensor/platform_sensor_provider_base.cc |
| @@ -22,29 +22,36 @@ const uint64_t kSharedBufferSizeInBytes = |
| PlatformSensorProviderBase::PlatformSensorProviderBase() = default; |
| PlatformSensorProviderBase::~PlatformSensorProviderBase() = default; |
| -scoped_refptr<PlatformSensor> PlatformSensorProviderBase::CreateSensor( |
| +void PlatformSensorProviderBase::CreateSensor( |
| mojom::SensorType type, |
| uint64_t size, |
| - uint64_t offset) { |
| + uint64_t offset, |
| + const CreateSensorCallback& callback) { |
| DCHECK(CalledOnValidThread()); |
| if (!CreateSharedBufferIfNeeded()) |
| - return nullptr; |
| + return; |
|
Mikhail
2016/09/26 09:52:23
it has to run callback with nullptr, right?
maksims (do not use this acc)
2016/09/27 10:17:25
Done.
|
| mojo::ScopedSharedBufferMapping mapping = |
| shared_buffer_handle_->MapAtOffset(size, offset); |
| if (!mapping) |
| - return nullptr; |
| - |
| - scoped_refptr<PlatformSensor> new_sensor = |
| - CreateSensorInternal(type, std::move(mapping), size); |
| - if (!new_sensor) |
| - return nullptr; |
| - |
| - DCHECK(!ContainsKey(sensor_map_, type)); |
| - sensor_map_[type] = new_sensor.get(); |
| - |
| - return new_sensor; |
| + return; |
|
Mikhail
2016/09/26 09:52:23
ditto
maksims (do not use this acc)
2016/09/27 10:17:25
Done.
|
| + |
| + auto it = requests_map_.find(type); |
| + if (it != requests_map_.end()) { |
| + it->second.push_back(callback); |
| + } else { |
| + DCHECK(!ContainsKey(requests_map_, type)); |
|
shalamov
2016/09/27 11:27:01
This DCHECK would never fail, right? Maybe it is b
maksims (do not use this acc)
2016/09/27 12:19:37
Done.
|
| + |
| + CallbackQueue pending_requests; |
|
Mikhail
2016/09/27 11:29:19
nit: could be 'requests_map_[type] = CallbackQueue
maksims (do not use this acc)
2016/09/27 12:19:37
Done.
|
| + pending_requests.push_back(callback); |
| + requests_map_[type] = pending_requests; |
| + |
| + CreateSensorInternal( |
| + type, std::move(mapping), size, |
| + base::Bind(&PlatformSensorProviderBase::NotifySensorCreated, |
| + base::Unretained(this), type)); |
| + } |
| } |
| scoped_refptr<PlatformSensor> PlatformSensorProviderBase::GetSensor( |
| @@ -83,4 +90,25 @@ PlatformSensorProviderBase::CloneSharedBufferHandle() { |
| return shared_buffer_handle_->Clone(); |
| } |
| +void PlatformSensorProviderBase::NotifySensorCreated( |
| + mojom::SensorType type, |
| + scoped_refptr<PlatformSensor> sensor) { |
| + DCHECK(CalledOnValidThread()); |
| + DCHECK(!ContainsKey(sensor_map_, type)); |
| + DCHECK(ContainsKey(requests_map_, type)); |
| + |
| + if (sensor) |
| + sensor_map_[type] = sensor.get(); |
| + |
| + // Inform subscribers about the sensor. |
| + // |sensor| can be nullptr here. |
| + auto it = requests_map_.find(type); |
| + if (it != requests_map_.end()) { |
|
Mikhail
2016/09/27 11:29:19
it can never be 'it == requests_map_.end()', condi
maksims (do not use this acc)
2016/09/27 12:19:37
Right. Done!
|
| + for (auto& cb : it->second) { |
| + cb.Run(sensor); |
| + } |
| + } |
| + requests_map_.erase(type); |
| +} |
| + |
| } // namespace device |