summaryrefslogtreecommitdiffstats
path: root/libs/gui
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2012-09-12 13:22:35 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-09-12 13:22:35 -0700
commitc272430960047de4e9b2f169fb053bd0aedce3b1 (patch)
treed97ae8f4f83df05e144288af754776bf09d4c84e /libs/gui
parenta0931d657551f5098f805fbdeeed2b060bbe6171 (diff)
parent6652b3edcb7ef5402c05db12f477ceb23c27d6ec (diff)
downloadframeworks_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.cpp39
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;
}
// ---------------------------------------------------------------------------