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 Diff line number Diff line
@@ -85,31 +85,36 @@ private:
    sp<AidlServiceManager> mTheRealServiceManager;
};

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

sp<IServiceManager> defaultServiceManager()
{

    if (gDefaultServiceManager != nullptr) return gDefaultServiceManager;

    {
        AutoMutex _l(gDefaultServiceManagerLock);
        while (gDefaultServiceManager == nullptr) {
            gDefaultServiceManager = new ServiceManagerShim(
                interface_cast<AidlServiceManager>(
                    ProcessState::self()->getContextObject(nullptr)));
            if (gDefaultServiceManager == nullptr)
    std::call_once(gSmOnce, []() {
        sp<AidlServiceManager> sm = nullptr;
        while (sm == nullptr) {
            sm = interface_cast<AidlServiceManager>(ProcessState::self()->getContextObject(nullptr));
            if (sm == nullptr) {
                sleep(1);
            }
        }

        gDefaultServiceManager = new ServiceManagerShim(sm);
    });

    return gDefaultServiceManager;
}

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

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

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

/**
 * 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);