Loading services/sensorservice/SensorDevice.cpp +47 −14 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ static status_t StatusFromResult(Result result) { } } SensorDevice::SensorDevice() { SensorDevice::SensorDevice() : mHidlTransportErrors(20) { // SensorDevice may wait upto 100ms * 10 = 1s for hidl service. constexpr auto RETRY_DELAY = std::chrono::milliseconds(100); size_t retry = 10; Loading Loading @@ -118,6 +118,14 @@ std::string SensorDevice::dump() const { if (mSensors == NULL) return "HAL not initialized\n"; String8 result; result.appendFormat("Saw %d hidlTransport Errors\n", mTotalHidlTransportErrors); for (auto it = mHidlTransportErrors.begin() ; it != mHidlTransportErrors.end(); it++ ) { result += "\t"; result += it->toString(); result += "\n"; } checkReturn(mSensors->getSensorsList([&](const auto &list){ const size_t count = list.size(); Loading Loading @@ -182,8 +190,11 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { if (mSensors == NULL) return NO_INIT; ssize_t err; int numHidlTransportErrors = 0; bool hidlTransportError = false; checkReturn(mSensors->poll( do { auto ret = mSensors->poll( count, [&](auto result, const auto &events, Loading @@ -194,7 +205,29 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { } else { err = StatusFromResult(result); } })); }); if (ret.isOk()) { hidlTransportError = false; } else { hidlTransportError = true; numHidlTransportErrors++; if (numHidlTransportErrors > 50) { // Log error and bail ALOGE("Max Hidl transport errors this cycle : %d", numHidlTransportErrors); handleHidlDeath(ret.description()); } else { std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } } while (hidlTransportError); if(numHidlTransportErrors > 0) { ALOGE("Saw %d Hidl transport failures", numHidlTransportErrors); HidlTransportErrorLog errLog(time(NULL), numHidlTransportErrors); mHidlTransportErrors.add(errLog); mTotalHidlTransportErrors++; } return err; } Loading services/sensorservice/SensorDevice.h +33 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ #include "android/hardware/sensors/1.0/ISensors.h" #include "RingBuffer.h" // --------------------------------------------------------------------------- namespace android { Loading @@ -41,6 +43,33 @@ using hardware::Return; class SensorDevice : public Singleton<SensorDevice>, public Dumpable { public: class HidlTransportErrorLog { public: HidlTransportErrorLog() { mTs = 0; mCount = 0; } HidlTransportErrorLog(time_t ts, int count) { mTs = ts; mCount = count; } String8 toString() const { String8 result; struct tm *timeInfo = localtime(&mTs); result.appendFormat("%02d:%02d:%02d :: %d", timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec, mCount); return result; } private: time_t mTs; // timestamp of the error int mCount; // number of transport errors observed }; ssize_t getSensorList(sensor_t const** list); void handleDynamicSensorConnection(int handle, bool connected); Loading Loading @@ -125,6 +154,10 @@ private: }; DefaultKeyedVector<int, Info> mActivationCount; // Keep track of any hidl transport failures SensorServiceUtil::RingBuffer<HidlTransportErrorLog> mHidlTransportErrors; int mTotalHidlTransportErrors; // Use this vector to determine which client is activated or deactivated. SortedVector<void *> mDisabledClients; SensorDevice(); Loading Loading
services/sensorservice/SensorDevice.cpp +47 −14 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ static status_t StatusFromResult(Result result) { } } SensorDevice::SensorDevice() { SensorDevice::SensorDevice() : mHidlTransportErrors(20) { // SensorDevice may wait upto 100ms * 10 = 1s for hidl service. constexpr auto RETRY_DELAY = std::chrono::milliseconds(100); size_t retry = 10; Loading Loading @@ -118,6 +118,14 @@ std::string SensorDevice::dump() const { if (mSensors == NULL) return "HAL not initialized\n"; String8 result; result.appendFormat("Saw %d hidlTransport Errors\n", mTotalHidlTransportErrors); for (auto it = mHidlTransportErrors.begin() ; it != mHidlTransportErrors.end(); it++ ) { result += "\t"; result += it->toString(); result += "\n"; } checkReturn(mSensors->getSensorsList([&](const auto &list){ const size_t count = list.size(); Loading Loading @@ -182,8 +190,11 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { if (mSensors == NULL) return NO_INIT; ssize_t err; int numHidlTransportErrors = 0; bool hidlTransportError = false; checkReturn(mSensors->poll( do { auto ret = mSensors->poll( count, [&](auto result, const auto &events, Loading @@ -194,7 +205,29 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { } else { err = StatusFromResult(result); } })); }); if (ret.isOk()) { hidlTransportError = false; } else { hidlTransportError = true; numHidlTransportErrors++; if (numHidlTransportErrors > 50) { // Log error and bail ALOGE("Max Hidl transport errors this cycle : %d", numHidlTransportErrors); handleHidlDeath(ret.description()); } else { std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } } while (hidlTransportError); if(numHidlTransportErrors > 0) { ALOGE("Saw %d Hidl transport failures", numHidlTransportErrors); HidlTransportErrorLog errLog(time(NULL), numHidlTransportErrors); mHidlTransportErrors.add(errLog); mTotalHidlTransportErrors++; } return err; } Loading
services/sensorservice/SensorDevice.h +33 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ #include "android/hardware/sensors/1.0/ISensors.h" #include "RingBuffer.h" // --------------------------------------------------------------------------- namespace android { Loading @@ -41,6 +43,33 @@ using hardware::Return; class SensorDevice : public Singleton<SensorDevice>, public Dumpable { public: class HidlTransportErrorLog { public: HidlTransportErrorLog() { mTs = 0; mCount = 0; } HidlTransportErrorLog(time_t ts, int count) { mTs = ts; mCount = count; } String8 toString() const { String8 result; struct tm *timeInfo = localtime(&mTs); result.appendFormat("%02d:%02d:%02d :: %d", timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec, mCount); return result; } private: time_t mTs; // timestamp of the error int mCount; // number of transport errors observed }; ssize_t getSensorList(sensor_t const** list); void handleDynamicSensorConnection(int handle, bool connected); Loading Loading @@ -125,6 +154,10 @@ private: }; DefaultKeyedVector<int, Info> mActivationCount; // Keep track of any hidl transport failures SensorServiceUtil::RingBuffer<HidlTransportErrorLog> mHidlTransportErrors; int mTotalHidlTransportErrors; // Use this vector to determine which client is activated or deactivated. SortedVector<void *> mDisabledClients; SensorDevice(); Loading