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

Commit 9f57e3c9 authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

Crash audioserver if EPIPE (DEAD_OBJECT) is received from the HAL

audioflinger doesn't have a proper way to re-establish all
the opened streams if HAL crashes. The only valid way of dealing
with them is to restart the audioserver.

Although broadcastradio and sountrigger have cleaner protocols
for dealing with HAL failures and can handle HAL crash and restart,
since the audio side will anyway get broken, it makes sense
to also kill the audioserver when they detect HAL crash.

Change-Id: I5f8e8c1d0981042cdd435a3ddbb6526e9f226e6b
Test: kill audio-hal process, watch dmesg and logcat
parent e158da59
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -82,9 +82,16 @@ status_t ConversionHelperHidl::analyzeResult(const Result& result) {
    }
}

// static
void ConversionHelperHidl::crashIfHalIsDead(const Status& status) {
    LOG_ALWAYS_FATAL_IF(
            status.transactionError() == DEAD_OBJECT, "HAL server crashed, need to restart");
}

status_t ConversionHelperHidl::processReturn(const char* funcName, const Status& status) {
    const status_t st = status.transactionError();
    ALOGE_IF(st, "%s %p %s: %s (from rpc)", mClassName, this, funcName, strerror(-st));
    crashIfHalIsDead(status);
    return st;
}

@@ -93,6 +100,7 @@ status_t ConversionHelperHidl::processReturn(
    const status_t st = status.isOk() ? analyzeResult(retval) : status.transactionError();
    ALOGE_IF(!status.isOk() && st, "%s %p %s: %s (from rpc)",
            mClassName, this, funcName, strerror(-st));
    crashIfHalIsDead(status);
    return st;
}

+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ using ::android::hardware::hidl_vec;
namespace android {

class ConversionHelperHidl {
  public:
    static void crashIfHalIsDead(const Status& status);

  protected:
    static status_t keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys);
    static status_t parametersFromHal(const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams);
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <android/hardware/audio/2.0/IDevice.h>
#include <utils/Log.h>

#include "ConversionHelperHidl.h"
#include "DeviceHalHidl.h"
#include "DevicesFactoryHalHidl.h"

@@ -82,6 +83,7 @@ status_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterfa
        else if (retval == Result::INVALID_ARGUMENTS) return BAD_VALUE;
        else return NO_INIT;
    }
    ConversionHelperHidl::crashIfHalIsDead(ret.getStatus());
    return ret.getStatus().transactionError();
}

+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <media/EffectsFactoryApi.h>
#include <utils/Log.h>

#include "ConversionHelperHidl.h"
#include "EffectHalHidl.h"
#include "HidlUtils.h"

@@ -102,6 +103,7 @@ status_t EffectHalHidl::getDescriptor(effect_descriptor_t *pDescriptor) {
                    effectDescriptorToHal(result, pDescriptor);
                }
            });
    ConversionHelperHidl::crashIfHalIsDead(ret.getStatus());
    return ret.getStatus().isOk() ? analyzeResult(retval) : ret.getStatus().transactionError();
}

+5 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <cutils/native_handle.h>
#include <media/EffectsFactoryApi.h>

#include "ConversionHelperHidl.h"
#include "EffectHalHidl.h"
#include "EffectsFactoryHalHidl.h"
#include "HidlUtils.h"
@@ -63,6 +64,7 @@ status_t EffectsFactoryHalHidl::queryAllDescriptors() {
        return retval == Result::OK ? OK : NO_INIT;
    }
    mLastDescriptors.resize(0);
    ConversionHelperHidl::crashIfHalIsDead(ret.getStatus());
    return ret.getStatus().transactionError();
}

@@ -107,6 +109,7 @@ status_t EffectsFactoryHalHidl::getDescriptor(
        else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND;
        else return NO_INIT;
    }
    ConversionHelperHidl::crashIfHalIsDead(ret.getStatus());
    return ret.getStatus().transactionError();
}

@@ -130,6 +133,7 @@ status_t EffectsFactoryHalHidl::createEffect(
        else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND;
        else return NO_INIT;
    }
    ConversionHelperHidl::crashIfHalIsDead(ret.getStatus());
    return ret.getStatus().transactionError();
}

@@ -139,6 +143,7 @@ status_t EffectsFactoryHalHidl::dumpEffects(int fd) {
    hidlHandle->data[0] = fd;
    Return<void> ret = mEffectsFactory->debugDump(hidlHandle);
    native_handle_delete(hidlHandle);
    ConversionHelperHidl::crashIfHalIsDead(ret.getStatus());
    return ret.getStatus().transactionError();
}

Loading