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