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

Commit 65be59a4 authored by Luca Stefani's avatar Luca Stefani
Browse files

powermanager: Make Lineage HAL use its own mutex

Change-Id: Ide34d8e4aeec18820f8ca5ad73021bfa49c33ef3
parent 21fb5bef
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -67,12 +67,13 @@ public:

private:
    std::mutex mConnectedHalMutex;
    std::mutex mConnectedLineageHalMutex;
    std::unique_ptr<HalConnector> mHalConnector;

    // Shared pointers to keep global pointer and allow local copies to be used in
    // different threads
    std::shared_ptr<HalWrapper> mConnectedHal GUARDED_BY(mConnectedHalMutex) = nullptr;
    std::shared_ptr<HalWrapper> mConnectedLineageHal GUARDED_BY(mConnectedHalMutex) = nullptr;
    std::shared_ptr<HalWrapper> mConnectedLineageHal GUARDED_BY(mConnectedLineageHalMutex) = nullptr;
    const std::shared_ptr<HalWrapper> mDefaultHal = std::make_shared<EmptyHalWrapper>();

    std::shared_ptr<HalWrapper> initHal();
+3 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ namespace power {
class PowerHalLoader {
public:
    static void unloadAll();
    static void unloadLineage();
    static sp<hardware::power::IPower> loadAidl();
    static sp<hardware::power::V1_0::IPower> loadHidlV1_0();
    static sp<hardware::power::V1_1::IPower> loadHidlV1_1();
@@ -37,10 +38,11 @@ public:

private:
    static std::mutex gHalMutex;
    static std::mutex gLineageHalMutex;
    static sp<hardware::power::IPower> gHalAidl GUARDED_BY(gHalMutex);
    static sp<hardware::power::V1_0::IPower> gHalHidlV1_0 GUARDED_BY(gHalMutex);
    static sp<hardware::power::V1_1::IPower> gHalHidlV1_1 GUARDED_BY(gHalMutex);
    static sp<vendor::lineage::power::IPower> gHalLineageAidl GUARDED_BY(gHalMutex);
    static sp<vendor::lineage::power::IPower> gHalLineageAidl GUARDED_BY(gLineageHalMutex);

    static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked()
            EXCLUSIVE_LOCKS_REQUIRED(gHalMutex);
+2 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ std::unique_ptr<HalWrapper> HalConnector::connectLineage() {

void HalConnector::reset() {
    PowerHalLoader::unloadAll();
    PowerHalLoader::unloadLineage();
}

// -------------------------------------------------------------------------------------------------
@@ -85,7 +86,7 @@ std::shared_ptr<HalWrapper> PowerHalController::initHal() {
// Check validity of current handle to the Lineage power HAL service, and create a new
// one if necessary.
std::shared_ptr<HalWrapper> PowerHalController::initLineageHal() {
    std::lock_guard<std::mutex> lock(mConnectedHalMutex);
    std::lock_guard<std::mutex> lock(mConnectedLineageHalMutex);
    if (mConnectedLineageHal == nullptr) {
        mConnectedLineageHal = mHalConnector->connectLineage();
        if (mConnectedLineageHal == nullptr) {
+6 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ sp<T> loadHal(bool& exists, sp<T>& hal, F& loadFn, const char* halName) {
// -------------------------------------------------------------------------------------------------

std::mutex PowerHalLoader::gHalMutex;
std::mutex PowerHalLoader::gLineageHalMutex;
sp<IPower> PowerHalLoader::gHalAidl = nullptr;
sp<V1_0::IPower> PowerHalLoader::gHalHidlV1_0 = nullptr;
sp<V1_1::IPower> PowerHalLoader::gHalHidlV1_1 = nullptr;
@@ -64,6 +65,10 @@ void PowerHalLoader::unloadAll() {
    gHalAidl = nullptr;
    gHalHidlV1_0 = nullptr;
    gHalHidlV1_1 = nullptr;
}

void PowerHalLoader::unloadLineage() {
    std::lock_guard<std::mutex> lock(gLineageHalMutex);
    gHalLineageAidl = nullptr;
}

@@ -87,7 +92,7 @@ sp<V1_1::IPower> PowerHalLoader::loadHidlV1_1() {
}

sp<LineageAidl::IPower> PowerHalLoader::loadLineageAidl() {
    std::lock_guard<std::mutex> lock(gHalMutex);
    std::lock_guard<std::mutex> lock(gLineageHalMutex);
    static bool gHalExists = true;
    static auto loadFn = []() { return waitForVintfService<LineageAidl::IPower>(); };
    return loadHal<LineageAidl::IPower>(gHalExists, gHalLineageAidl, loadFn, "Lineage AIDL");