Chromium Code Reviews| Index: device/generic_sensor/platform_sensor_reader_win.cc |
| diff --git a/device/generic_sensor/platform_sensor_reader_win.cc b/device/generic_sensor/platform_sensor_reader_win.cc |
| index 7f292b1fb2a197de00216dad2075d5a865c44c2b..f1a9eebd37365658937d81a5052751aa1e8bfdca 100644 |
| --- a/device/generic_sensor/platform_sensor_reader_win.cc |
| +++ b/device/generic_sensor/platform_sensor_reader_win.cc |
| @@ -242,7 +242,8 @@ PlatformSensorReaderWin::PlatformSensorReaderWin( |
| sensor_active_(false), |
| client_(nullptr), |
| sensor_(sensor), |
| - event_listener_(new EventListener(this)) { |
| + event_listener_(new EventListener(this)), |
| + weak_factory_(this) { |
| DCHECK(init_params_); |
| DCHECK(!init_params_->reader_func.is_null()); |
| DCHECK(sensor_); |
| @@ -273,24 +274,26 @@ bool PlatformSensorReaderWin::StartSensor( |
| if (!SetReportingInterval(configuration)) |
| return false; |
| - // Set event listener. |
| if (!sensor_active_) { |
| - base::win::ScopedComPtr<ISensorEvents> sensor_events; |
| - HRESULT hr = event_listener_->QueryInterface(__uuidof(ISensorEvents), |
| - sensor_events.ReceiveVoid()); |
| - |
| - if (FAILED(hr) || !sensor_events) |
| - return false; |
| - |
| - if (FAILED(sensor_->SetEventSink(sensor_events.get()))) |
| - return false; |
| - |
| - sensor_active_ = true; |
| + task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&PlatformSensorReaderWin::ListenSensorEvent, |
| + weak_factory_.GetWeakPtr())); |
| } |
| return true; |
| } |
| +void PlatformSensorReaderWin::ListenSensorEvent() { |
| + base::AutoLock autolock(lock_); |
|
shalamov
2016/11/15 07:31:19
If it is accessed only on sensor thread, I think y
|
| + event_listener_->AddRef(); |
| + // Set event listener. |
| + if (FAILED(sensor_->SetEventSink(event_listener_.get()))) { |
| + SensorError(); |
| + StopSensor(); |
| + } |
| + sensor_active_ = true; |
|
shalamov
2016/11/15 07:31:19
Should this be moved to:
if (!sensor_active_) {
|
| +} |
| + |
| bool PlatformSensorReaderWin::SetReportingInterval( |
| const PlatformSensorConfiguration& configuration) { |
| base::win::ScopedComPtr<IPortableDeviceValues> props; |