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

Commit 5482fe02 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Revert "audiohal: Add diagnostics to investigate HAL call crashes"" into oc-dev

parents abcd3230 f811acf0
Loading
Loading
Loading
Loading
+3 −56
Original line number Diff line number Diff line
@@ -17,11 +17,9 @@
#define LOG_TAG "DeviceHAL"
//#define LOG_NDEBUG 0

#include <algorithm>
#include <memory.h>
#include <string.h>
#include <algorithm>
#include <mutex>
#include <vector>

#include <android/log.h>

@@ -38,57 +36,8 @@ namespace audio {
namespace V2_0 {
namespace implementation {

namespace {

class Diagnostics {
   public:
    static Diagnostics& getInstance() {
        std::lock_guard<std::mutex> _(mLock);
        if (mInstance == nullptr) {
            mInstance = new Diagnostics;
        }
        return *mInstance;
    }

    void registerDevice(Device* dev) {
        std::lock_guard<std::mutex> _(mLock);
        mDevices.push_back(wp<Device>(dev));
    }

    void checkForErasedHalCblk(const Device* dev) {
        if (dev->version() != 0) return;  // all OK

        std::ostringstream ss;
        ss << "Zero HAL CB for " << dev->type() << ":" << std::hex
           << dev->device() << "; Others: ";
        {
            std::lock_guard<std::mutex> _(mLock);
            for (auto wp : mDevices) {
                sp<Device> other{wp.promote()};
                if (other.get() == nullptr || other.get() == dev) continue;
                ss << other->type() << ":" << other->version() << ":"
                   << std::hex << other->device() << "; ";
            }
        }
        ALOGE("%s", ss.str().c_str());
    }

   private:
    Diagnostics() {}

    static std::mutex mLock;
    static Diagnostics* mInstance;
    std::vector<wp<Device>> mDevices;
};

std::mutex Diagnostics::mLock;
Diagnostics* Diagnostics::mInstance{nullptr};

}  // namespace

Device::Device(audio_hw_device_t* device, const char* type)
    : mDevice{device}, mType{type} {
    Diagnostics::getInstance().registerDevice(this);
Device::Device(audio_hw_device_t* device)
        : mDevice(device) {
}

Device::~Device() {
@@ -127,12 +76,10 @@ void Device::closeOutputStream(audio_stream_out_t* stream) {
}

char* Device::halGetParameters(const char* keys) {
    Diagnostics::getInstance().checkForErasedHalCblk(this);
    return mDevice->get_parameters(mDevice, keys);
}

int Device::halSetParameters(const char* keysAndValues) {
    Diagnostics::getInstance().checkForErasedHalCblk(this);
    return mDevice->set_parameters(mDevice, keysAndValues);
}

+4 −5
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ using ::android::hardware::hidl_string;
using ::android::sp;

struct Device : public IDevice, public ParametersUtil {
    Device(audio_hw_device_t* device, const char* type);
    explicit Device(audio_hw_device_t* device);

    // Methods from ::android::hardware::audio::V2_0::IDevice follow.
    Return<Result> initCheck()  override;
@@ -101,18 +101,17 @@ struct Device : public IDevice, public ParametersUtil {
    void closeInputStream(audio_stream_in_t* stream);
    void closeOutputStream(audio_stream_out_t* stream);
    audio_hw_device_t* device() const { return mDevice; }
    const char* type() const { return mType; }
    uint32_t version() const { return mDevice->common.version; }

  private:
    audio_hw_device_t *mDevice;
    const char* mType;

    virtual ~Device();

    // Methods from ParametersUtil.
    char* halGetParameters(const char* keys) override;
    int halSetParameters(const char* keysAndValues) override;

    uint32_t version() const { return mDevice->common.version; }
};

}  // namespace implementation
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ Return<void> DevicesFactory::openDevice(IDevicesFactory::Device device, openDevi
                result = new PrimaryDevice(halDevice);
            } else {
                result = new ::android::hardware::audio::V2_0::implementation::
                    Device(halDevice, moduleName);
                    Device(halDevice);
            }
            retval = Result::OK;
        } else if (halStatus == -EINVAL) {
+2 −1
Original line number Diff line number Diff line
@@ -26,7 +26,8 @@ namespace V2_0 {
namespace implementation {

PrimaryDevice::PrimaryDevice(audio_hw_device_t* device)
    : mDevice{new Device(device, AUDIO_HARDWARE_MODULE_ID_PRIMARY)} {}
        : mDevice(new Device(device)) {
}

PrimaryDevice::~PrimaryDevice() {}