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

Commit 6d2e3756 authored by Brian Duddie's avatar Brian Duddie
Browse files

Avoid deadlock if HAL dies at init

The SensorDevice constructor is invoked with the Singleton lock held, so
ensure we won't attempt to call getInstance() from this context via
handleHidlDeath().

Bug: 133445520
Test: use custom HAL that crashes at first getSensorList query, verify
      framework does not deadlock
Change-Id: Ia0903412cdb30474c962687bc95b8df6bf2df25e
parent 8e6f31c1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1012,7 +1012,7 @@ void SensorDevice::convertToSensorEvents(
}

void SensorDevice::handleHidlDeath(const std::string & detail) {
    if (!SensorDevice::getInstance().mSensors->supportsMessageQueues()) {
    if (!mSensors->supportsMessageQueues()) {
        // restart is the only option at present.
        LOG_ALWAYS_FATAL("Abort due to ISensors hidl service failure, detail: %s.", detail.c_str());
    } else {
+3 −3
Original line number Diff line number Diff line
@@ -211,14 +211,14 @@ private:
    status_t batchLocked(void* ident, int handle, int flags, int64_t samplingPeriodNs,
                         int64_t maxBatchReportLatencyNs);

    static void handleHidlDeath(const std::string &detail);
    void handleHidlDeath(const std::string &detail);
    template<typename T>
    static void checkReturn(const Return<T>& ret) {
    void checkReturn(const Return<T>& ret) {
        if (!ret.isOk()) {
            handleHidlDeath(ret.description());
        }
    }
    static status_t checkReturnAndGetStatus(const Return<Result>& ret);
    status_t checkReturnAndGetStatus(const Return<Result>& ret);
    //TODO(b/67425500): remove waiter after bug is resolved.
    sp<SensorDeviceUtils::HidlServiceRegistrationWaiter> mRestartWaiter;