Only hold a weak pointer on SurfaceComposerClients
Each process maintains an array of active SurfaceComposerClient objects, so that they can be reused as new surfaces are parceled across. When a SurfaceComposerClient is disposed, it will remove itself from this list. However, because the list maintains a strong reference on the object, a reference cycle is created, and the client is never deleted. This patch changes the list to maintain weak pointers on the clients instead. Change-Id: I93dc8155fe28b4e350366a3400cdf22a8c77cdd3
This commit is contained in:
committed by
Garmin Android technology group
parent
69e398bd14
commit
d0964b3fdf
@@ -56,7 +56,7 @@ namespace android {
|
||||
// Must not be holding SurfaceComposerClient::mLock when acquiring gLock here.
|
||||
static Mutex gLock;
|
||||
static sp<ISurfaceComposer> gSurfaceManager;
|
||||
static DefaultKeyedVector< sp<IBinder>, sp<SurfaceComposerClient> > gActiveConnections;
|
||||
static DefaultKeyedVector< sp<IBinder>, wp<SurfaceComposerClient> > gActiveConnections;
|
||||
static SortedVector<sp<SurfaceComposerClient> > gOpenTransactions;
|
||||
static sp<IMemoryHeap> gServerCblkMemory;
|
||||
static volatile surface_flinger_cblk_t* gServerCblk;
|
||||
@@ -193,7 +193,7 @@ SurfaceComposerClient::clientForConnection(const sp<IBinder>& conn)
|
||||
|
||||
{ // scope for lock
|
||||
Mutex::Autolock _l(gLock);
|
||||
client = gActiveConnections.valueFor(conn);
|
||||
client = gActiveConnections.valueFor(conn).promote();
|
||||
}
|
||||
|
||||
if (client == 0) {
|
||||
@@ -361,8 +361,8 @@ void SurfaceComposerClient::openGlobalTransaction()
|
||||
const size_t N = gActiveConnections.size();
|
||||
VERBOSE("openGlobalTransaction (%ld clients)", N);
|
||||
for (size_t i=0; i<N; i++) {
|
||||
sp<SurfaceComposerClient> client(gActiveConnections.valueAt(i));
|
||||
if (gOpenTransactions.indexOf(client) < 0) {
|
||||
sp<SurfaceComposerClient> client(gActiveConnections.valueAt(i).promote());
|
||||
if (client != 0 && gOpenTransactions.indexOf(client) < 0) {
|
||||
if (client->openTransaction() == NO_ERROR) {
|
||||
if (gOpenTransactions.add(client) < 0) {
|
||||
// Ooops!
|
||||
|
||||
Reference in New Issue
Block a user