Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3680cbc7 authored by Ashutosh Joshi's avatar Ashutosh Joshi Committed by Android (Google) Code Review
Browse files

Merge "Add a retry mechanism to potentially allow recovery from HIDL failures."

parents 373a0800 96b12d8d
Loading
Loading
Loading
Loading
+47 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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();

@@ -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,
@@ -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;
}
+33 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@

#include "android/hardware/sensors/1.0/ISensors.h"

#include "RingBuffer.h"

// ---------------------------------------------------------------------------

namespace android {
@@ -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);
@@ -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();