diff options
-rw-r--r-- | include/ui/SurfaceComposerClient.h | 4 | ||||
-rw-r--r-- | libs/ui/SurfaceComposerClient.cpp | 65 |
2 files changed, 45 insertions, 24 deletions
diff --git a/include/ui/SurfaceComposerClient.h b/include/ui/SurfaceComposerClient.h index 269959c..8701928 100644 --- a/include/ui/SurfaceComposerClient.h +++ b/include/ui/SurfaceComposerClient.h @@ -20,6 +20,8 @@ #include <stdint.h> #include <sys/types.h> +#include <binder/IBinder.h> + #include <utils/SortedVector.h> #include <utils/RefBase.h> #include <utils/threads.h> @@ -106,6 +108,8 @@ public: static ssize_t getDisplayHeight(DisplayID dpy); static ssize_t getDisplayOrientation(DisplayID dpy); + status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient, + void* cookie = NULL, uint32_t flags = 0); private: friend class Surface; diff --git a/libs/ui/SurfaceComposerClient.cpp b/libs/ui/SurfaceComposerClient.cpp index 8401cb6..3baa281 100644 --- a/libs/ui/SurfaceComposerClient.cpp +++ b/libs/ui/SurfaceComposerClient.cpp @@ -62,34 +62,42 @@ static SortedVector<sp<SurfaceComposerClient> > gOpenTransactions; static sp<IMemoryHeap> gServerCblkMemory; static volatile surface_flinger_cblk_t* gServerCblk; -const sp<ISurfaceComposer>& _get_surface_manager() +static sp<ISurfaceComposer> getComposerService() { + sp<ISurfaceComposer> sc; + Mutex::Autolock _l(gLock); if (gSurfaceManager != 0) { - return gSurfaceManager; - } + sc = gSurfaceManager; + } else { + // release the lock while we're waiting... + gLock.unlock(); + + sp<IBinder> binder; + sp<IServiceManager> sm = defaultServiceManager(); + do { + binder = sm->getService(String16("SurfaceFlinger")); + if (binder == 0) { + LOGW("SurfaceFlinger not published, waiting..."); + usleep(500000); // 0.5 s + } + } while(binder == 0); - sp<IBinder> binder; - sp<IServiceManager> sm = defaultServiceManager(); - do { - binder = sm->getService(String16("SurfaceFlinger")); - if (binder == 0) { - LOGW("SurfaceFlinger not published, waiting..."); - usleep(500000); // 0.5 s + // grab the lock again for updating gSurfaceManager + gLock.lock(); + if (gSurfaceManager == 0) { + sc = interface_cast<ISurfaceComposer>(binder); + gSurfaceManager = sc; + } else { + sc = gSurfaceManager; } - } while(binder == 0); - sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder)); - - Mutex::Autolock _l(gLock); - if (gSurfaceManager == 0) { - gSurfaceManager = sc; } - return gSurfaceManager; + return sc; } static volatile surface_flinger_cblk_t const * get_cblk() { if (gServerCblk == 0) { - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); Mutex::Autolock _l(gLock); if (gServerCblk == 0) { gServerCblkMemory = sm->getCblk(); @@ -112,7 +120,7 @@ static inline int compare_type( const layer_state_t& lhs, SurfaceComposerClient::SurfaceComposerClient() { - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); if (sm == 0) { _init(0, 0); return; @@ -133,6 +141,15 @@ SurfaceComposerClient::SurfaceComposerClient( _init(sm, interface_cast<ISurfaceFlingerClient>(conn)); } + +status_t SurfaceComposerClient::linkToComposerDeath( + const sp<IBinder::DeathRecipient>& recipient, + void* cookie, uint32_t flags) +{ + sp<ISurfaceComposer> sm(getComposerService()); + return sm->asBinder()->linkToDeath(recipient, cookie, flags); +} + void SurfaceComposerClient::_init( const sp<ISurfaceComposer>& sm, const sp<ISurfaceFlingerClient>& conn) { @@ -183,7 +200,7 @@ SurfaceComposerClient::clientForConnection(const sp<IBinder>& conn) if (client == 0) { // Need to make a new client. - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); client = new SurfaceComposerClient(sm, conn); if (client != 0 && client->initCheck() == NO_ERROR) { Mutex::Autolock _l(gLock); @@ -377,7 +394,7 @@ void SurfaceComposerClient::closeGlobalTransaction() const size_t N = clients.size(); VERBOSE("closeGlobalTransaction (%ld clients)", N); - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); sm->openGlobalTransaction(); for (size_t i=0; i<N; i++) { clients[i]->closeTransaction(); @@ -389,20 +406,20 @@ void SurfaceComposerClient::closeGlobalTransaction() status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) { - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); return sm->freezeDisplay(dpy, flags); } status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) { - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); return sm->unfreezeDisplay(dpy, flags); } int SurfaceComposerClient::setOrientation(DisplayID dpy, int orientation, uint32_t flags) { - const sp<ISurfaceComposer>& sm(_get_surface_manager()); + sp<ISurfaceComposer> sm(getComposerService()); return sm->setOrientation(dpy, orientation, flags); } |