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

Commit 29d636cd authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Fix defaultServiceManager() locking and retry loop." am: b1e64b48

Change-Id: I9888bb394149a66abb82704a41aeacd66afa5014
parents 445b5a49 b1e64b48
Loading
Loading
Loading
Loading
+19 −14
Original line number Original line Diff line number Diff line
@@ -85,31 +85,36 @@ private:
    sp<AidlServiceManager> mTheRealServiceManager;
    sp<AidlServiceManager> mTheRealServiceManager;
};
};


static Mutex gDefaultServiceManagerLock;
static std::once_flag gSmOnce;
static sp<IServiceManager> gDefaultServiceManager;
static sp<IServiceManager> gDefaultServiceManager;


sp<IServiceManager> defaultServiceManager()
sp<IServiceManager> defaultServiceManager()
{
{

    std::call_once(gSmOnce, []() {
    if (gDefaultServiceManager != nullptr) return gDefaultServiceManager;
        sp<AidlServiceManager> sm = nullptr;

        while (sm == nullptr) {
    {
            sm = interface_cast<AidlServiceManager>(ProcessState::self()->getContextObject(nullptr));
        AutoMutex _l(gDefaultServiceManagerLock);
            if (sm == nullptr) {
        while (gDefaultServiceManager == nullptr) {
            gDefaultServiceManager = new ServiceManagerShim(
                interface_cast<AidlServiceManager>(
                    ProcessState::self()->getContextObject(nullptr)));
            if (gDefaultServiceManager == nullptr)
                sleep(1);
                sleep(1);
            }
            }
        }
        }


        gDefaultServiceManager = new ServiceManagerShim(sm);
    });

    return gDefaultServiceManager;
    return gDefaultServiceManager;
}
}


void setDefaultServiceManager(const sp<IServiceManager>& sm) {
void setDefaultServiceManager(const sp<IServiceManager>& sm) {
  AutoMutex _l(gDefaultServiceManagerLock);
    bool called = false;
    std::call_once(gSmOnce, [&]() {
        gDefaultServiceManager = sm;
        gDefaultServiceManager = sm;
        called = true;
    });

    if (!called) {
        LOG_ALWAYS_FATAL("setDefaultServiceManager() called after defaultServiceManager().");
    }
}
}


#if !defined(__ANDROID_VNDK__) && defined(__ANDROID__)
#if !defined(__ANDROID_VNDK__) && defined(__ANDROID__)
+3 −0
Original line number Original line Diff line number Diff line
@@ -102,6 +102,9 @@ sp<IServiceManager> defaultServiceManager();


/**
/**
 * Directly set the default service manager. Only used for testing.
 * Directly set the default service manager. Only used for testing.
 * Note that the caller is responsible for caling this method
 * *before* any call to defaultServiceManager(); if the latter is
 * called first, setDefaultServiceManager() will abort.
 */
 */
void setDefaultServiceManager(const sp<IServiceManager>& sm);
void setDefaultServiceManager(const sp<IServiceManager>& sm);