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 bbcdcc59492a31cb9edf1ba4e1e1609d534f4166..9cacb63f4f915da6ff33d733a576fbecaf334109 100644 |
--- a/device/generic_sensor/platform_sensor_reader_win.cc |
+++ b/device/generic_sensor/platform_sensor_reader_win.cc |
@@ -344,7 +344,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_); |
@@ -375,24 +376,24 @@ 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; |
- |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&PlatformSensorReaderWin::ListenSensorEvent, |
+ weak_factory_.GetWeakPtr())); |
sensor_active_ = true; |
} |
return true; |
} |
+void PlatformSensorReaderWin::ListenSensorEvent() { |
+ // Set event listener. |
+ if (FAILED(sensor_->SetEventSink(event_listener_.get()))) { |
+ SensorError(); |
+ StopSensor(); |
+ } |
+} |
+ |
bool PlatformSensorReaderWin::SetReportingInterval( |
const PlatformSensorConfiguration& configuration) { |
base::win::ScopedComPtr<IPortableDeviceValues> props; |