diff options
author | Andy McFadden <fadden@android.com> | 2012-09-12 13:22:35 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-09-12 13:22:35 -0700 |
commit | c272430960047de4e9b2f169fb053bd0aedce3b1 (patch) | |
tree | d97ae8f4f83df05e144288af754776bf09d4c84e /libs/gui | |
parent | a0931d657551f5098f805fbdeeed2b060bbe6171 (diff) | |
parent | 6652b3edcb7ef5402c05db12f477ceb23c27d6ec (diff) | |
download | frameworks_native-c272430960047de4e9b2f169fb053bd0aedce3b1.zip frameworks_native-c272430960047de4e9b2f169fb053bd0aedce3b1.tar.gz frameworks_native-c272430960047de4e9b2f169fb053bd0aedce3b1.tar.bz2 |
Merge "Watch for SurfaceFlinger death" into jb-mr1-dev
Diffstat (limited to 'libs/gui')
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 814036e..9b43ae8 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -46,14 +46,49 @@ ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); ComposerService::ComposerService() : Singleton<ComposerService>() { + Mutex::Autolock _l(mLock); + connectLocked(); +} + +void ComposerService::connectLocked() { const String16 name("SurfaceFlinger"); while (getService(name, &mComposerService) != NO_ERROR) { usleep(250000); } + assert(mComposerService != NULL); + + // Create the death listener. + class DeathObserver : public IBinder::DeathRecipient { + ComposerService& mComposerService; + virtual void binderDied(const wp<IBinder>& who) { + ALOGW("ComposerService remote (surfaceflinger) died [%p]", + who.unsafe_get()); + mComposerService.composerServiceDied(); + } + public: + DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } + }; + + mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); + mComposerService->asBinder()->linkToDeath(mDeathObserver); +} + +/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { + ComposerService& instance = ComposerService::getInstance(); + Mutex::Autolock _l(instance.mLock); + if (instance.mComposerService == NULL) { + ComposerService::getInstance().connectLocked(); + assert(instance.mComposerService != NULL); + ALOGD("ComposerService reconnected"); + } + return instance.mComposerService; } -sp<ISurfaceComposer> ComposerService::getComposerService() { - return ComposerService::getInstance().mComposerService; +void ComposerService::composerServiceDied() +{ + Mutex::Autolock _l(mLock); + mComposerService = NULL; + mDeathObserver = NULL; } // --------------------------------------------------------------------------- |