Loading libs/binder/IServiceManager.cpp +19 −14 Original line number Original line Diff line number Diff line Loading @@ -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__) Loading libs/binder/include/binder/IServiceManager.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading
libs/binder/IServiceManager.cpp +19 −14 Original line number Original line Diff line number Diff line Loading @@ -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__) Loading
libs/binder/include/binder/IServiceManager.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading