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

Commit fe5476a3 authored by Peng Xu's avatar Peng Xu
Browse files

Avoid locking global map during waiting for service

Wait for service before attempting to get a SensorManager object.

Bug: 36389997
Bug: 36404344
Test: system boots, sensors working with sensorlogger test
Change-Id: Ib5d41bc58edb8f6be56f803324a79a99a50da45e
parent 8c0761fc
Loading
Loading
Loading
Loading
+29 −19
Original line number Original line Diff line number Diff line
@@ -38,14 +38,15 @@
namespace android {
namespace android {
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------


android::Mutex android::SensorManager::sLock;
Mutex SensorManager::sLock;
std::map<String16, SensorManager*> android::SensorManager::sPackageInstances;
std::map<String16, SensorManager*> SensorManager::sPackageInstances;


SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) {
SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) {
    waitForSensorService(nullptr);

    Mutex::Autolock _l(sLock);
    Mutex::Autolock _l(sLock);
    SensorManager* sensorManager;
    SensorManager* sensorManager;
    std::map<String16, SensorManager*>::iterator iterator =
    auto iterator = sPackageInstances.find(packageName);
        sPackageInstances.find(packageName);


    if (iterator != sPackageInstances.end()) {
    if (iterator != sPackageInstances.end()) {
        sensorManager = iterator->second;
        sensorManager = iterator->second;
@@ -100,6 +101,28 @@ SensorManager::~SensorManager() {
    free(mSensorList);
    free(mSensorList);
}
}


status_t SensorManager::waitForSensorService(sp<ISensorServer> *server) {
    // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ...
    sp<ISensorServer> s;
    const String16 name("sensorservice");
    for (int i = 0; i < 60; i++) {
        status_t err = getService(name, &s);
        switch (err) {
            case NAME_NOT_FOUND:
                sleep(1);
                continue;
            case NO_ERROR:
                if (server != nullptr) {
                    *server = s;
                }
                return NO_ERROR;
            default:
                return err;
        }
    }
    return TIMED_OUT;
}

void SensorManager::sensorManagerDied() {
void SensorManager::sensorManagerDied() {
    Mutex::Autolock _l(mLock);
    Mutex::Autolock _l(mLock);
    mSensorServer.clear();
    mSensorServer.clear();
@@ -120,19 +143,8 @@ status_t SensorManager::assertStateLocked() {
        }
        }
    }
    }
    if (initSensorManager) {
    if (initSensorManager) {
        // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ...
        waitForSensorService(&mSensorServer);
        const String16 name("sensorservice");
        LOG_ALWAYS_FATAL_IF(mSensorServer == nullptr, "getService(SensorService) NULL");
        for (int i = 0; i < 60; i++) {
            status_t err = getService(name, &mSensorServer);
            if (err == NAME_NOT_FOUND) {
                sleep(1);
                continue;
            }
            if (err != NO_ERROR) {
                return err;
            }
            break;
        }


        class DeathObserver : public IBinder::DeathRecipient {
        class DeathObserver : public IBinder::DeathRecipient {
            SensorManager& mSensorManager;
            SensorManager& mSensorManager;
@@ -144,8 +156,6 @@ status_t SensorManager::assertStateLocked() {
            explicit DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { }
            explicit DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { }
        };
        };


        LOG_ALWAYS_FATAL_IF(mSensorServer.get() == NULL, "getService(SensorService) NULL");

        mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
        mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
        IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);
        IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);


+1 −0
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ public:
private:
private:
    // DeathRecipient interface
    // DeathRecipient interface
    void sensorManagerDied();
    void sensorManagerDied();
    static status_t waitForSensorService(sp<ISensorServer> *server);


    SensorManager(const String16& opPackageName);
    SensorManager(const String16& opPackageName);
    status_t assertStateLocked();
    status_t assertStateLocked();