Automatically reconnect sensors
Automatically reenable sensor connections for static sensors after a
Sensors HAL crash.
Bug: 111070257
Test: Request sensor events via a_sns_test, kill the sensors HAL,
verify that events are no longer received, restart the HAL and
verify that a_sns_test receives new sensor events.
Change-Id: I2baa7745cf07e29c186ac4b80679393d6e48bd56
diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h
index 2da60b6..e1024ac 100644
--- a/services/sensorservice/SensorDevice.h
+++ b/services/sensorservice/SensorDevice.h
@@ -77,6 +77,8 @@
};
~SensorDevice();
+ void prepareForReconnect();
+ void reconnect();
ssize_t getSensorList(sensor_t const** list);
@@ -114,6 +116,10 @@
hardware::Return<void> onDynamicSensorsDisconnected(
const hardware::hidl_vec<int32_t> &dynamicSensorHandlesRemoved);
+ bool isReconnecting() const {
+ return mReconnecting;
+ }
+
// Dumpable
virtual std::string dump() const;
private:
@@ -167,7 +173,7 @@
// the removed ident. If index >=0, ident is present and successfully removed.
ssize_t removeBatchParamsForIdent(void* ident);
- int numActiveClients();
+ int numActiveClients() const;
};
DefaultKeyedVector<int, Info> mActivationCount;
@@ -179,6 +185,11 @@
SortedVector<void *> mDisabledClients;
SensorDevice();
bool connectHidlService();
+ void initializeSensorList();
+ void reactivateSensors(const DefaultKeyedVector<int, Info>& previousActivations);
+ static bool sensorHandlesChanged(const Vector<sensor_t>& oldSensorList,
+ const Vector<sensor_t>& newSensorList);
+ static bool sensorIsEquivalent(const sensor_t& prevSensor, const sensor_t& newSensor);
enum HalConnectionStatus {
CONNECTED, // Successfully connected to the HAL
@@ -191,6 +202,9 @@
ssize_t pollHal(sensors_event_t* buffer, size_t count);
ssize_t pollFmq(sensors_event_t* buffer, size_t count);
+ status_t activateLocked(void* ident, int handle, int enabled);
+ status_t batchLocked(void* ident, int handle, int flags, int64_t samplingPeriodNs,
+ int64_t maxBatchReportLatencyNs);
static void handleHidlDeath(const std::string &detail);
template<typename T>
@@ -228,6 +242,7 @@
std::array<Event, SensorEventQueue::MAX_RECEIVE_BUFFER_EVENT_COUNT> mEventBuffer;
sp<SensorsHalDeathReceivier> mSensorsHalDeathReceiver;
+ std::atomic_bool mReconnecting;
};
// ---------------------------------------------------------------------------