Loading include/ui/SurfaceComposerClient.h +4 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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; Loading libs/ui/SurfaceComposerClient.cpp +41 −24 Original line number Diff line number Diff line Loading @@ -62,11 +62,15 @@ 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(); Loading @@ -77,19 +81,23 @@ const sp<ISurfaceComposer>& _get_surface_manager() usleep(500000); // 0.5 s } } while(binder == 0); sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder)); Mutex::Autolock _l(gLock); // grab the lock again for updating gSurfaceManager gLock.lock(); if (gSurfaceManager == 0) { sc = interface_cast<ISurfaceComposer>(binder); gSurfaceManager = sc; } else { sc = gSurfaceManager; } } 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(); Loading @@ -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; Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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); } Loading Loading
include/ui/SurfaceComposerClient.h +4 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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; Loading
libs/ui/SurfaceComposerClient.cpp +41 −24 Original line number Diff line number Diff line Loading @@ -62,11 +62,15 @@ 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(); Loading @@ -77,19 +81,23 @@ const sp<ISurfaceComposer>& _get_surface_manager() usleep(500000); // 0.5 s } } while(binder == 0); sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder)); Mutex::Autolock _l(gLock); // grab the lock again for updating gSurfaceManager gLock.lock(); if (gSurfaceManager == 0) { sc = interface_cast<ISurfaceComposer>(binder); gSurfaceManager = sc; } else { sc = gSurfaceManager; } } 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(); Loading @@ -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; Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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); } Loading