Ensure correct destruction of SensorPoseProviderImpl
- Delete the queue from the same thread that creates it (or otherwise we
risk it being deleted after its looper has already been destroyed).
- Disable all sensors prior to shutting down the queue.
Test: Ran SensorPoseProvider-example
Bug: 188502620
Change-Id: I1200c9fd90bfe750608e809a667f54aa85250b55
diff --git a/media/libheadtracking/SensorPoseProvider.cpp b/media/libheadtracking/SensorPoseProvider.cpp
index 8e6c2ff..da1d8cb 100644
--- a/media/libheadtracking/SensorPoseProvider.cpp
+++ b/media/libheadtracking/SensorPoseProvider.cpp
@@ -101,6 +101,8 @@
}
~SensorPoseProviderImpl() override {
+ // Disable all active sensors.
+ mEnabledSensors.clear();
ALooper_wake(mLooper);
mThread.join();
}
@@ -109,12 +111,12 @@
int32_t handle = ASensor_getHandle(sensor);
// Enable the sensor.
- if (ASensorEventQueue_registerSensor(mQueue->get(), sensor, samplingPeriod.count(), 0)) {
+ if (ASensorEventQueue_registerSensor(mQueue, sensor, samplingPeriod.count(), 0)) {
ALOGE("Failed to enable sensor");
return INVALID_HANDLE;
}
- mEnabledSensors.emplace(handle, SensorEnableGuard(mQueue->get(), sensor));
+ mEnabledSensors.emplace(handle, SensorEnableGuard(mQueue, sensor));
return handle;
}
@@ -123,9 +125,10 @@
private:
ALooper* mLooper;
Listener* const mListener;
+
std::thread mThread;
std::map<int32_t, SensorEnableGuard> mEnabledSensors;
- std::unique_ptr<EventQueueGuard> mQueue;
+ ASensorEventQueue* mQueue;
// We must do some of the initialization operations on the worker thread, because the API relies
// on the thread-local looper. In addition, as a matter of convenience, we store some of the
@@ -159,16 +162,15 @@
}
// Create event queue.
- ASensorEventQueue* queue =
- ASensorManager_createEventQueue(sensor_manager, mLooper, kIdent, nullptr, nullptr);
+ mQueue = ASensorManager_createEventQueue(sensor_manager, mLooper, kIdent, nullptr, nullptr);
- if (queue == nullptr) {
+ if (mQueue == nullptr) {
ALOGE("Failed to create a sensor event queue");
initFinished(false);
return;
}
- mQueue.reset(new EventQueueGuard(sensor_manager, queue));
+ EventQueueGuard eventQueueGuard(sensor_manager, mQueue);
initFinished(true);
@@ -190,7 +192,7 @@
// Process an event.
ASensorEvent event;
- ssize_t size = ASensorEventQueue_getEvents(queue, &event, 1);
+ ssize_t size = ASensorEventQueue_getEvents(mQueue, &event, 1);
if (size < 0 || size > 1) {
ALOGE("Unexpected return value from ASensorEventQueue_getEvents: %zd", size);
break;