From 90fcc94791b5970766ed4571ed85e7c76ffc7c55 Mon Sep 17 00:00:00 2001 From: Valerie Hau Date: Mon, 18 Nov 2019 11:18:57 -0800 Subject: Keeping sp around in ClientCache binderDied is no longer called if all sp references are dropped in SF process. Keep an sp around so that we can get notified to clean up the ClientCache/RenderEngine Bug: b/144371238 Test: build, boot, manual (script to open and close Chrome repeatedly, check RenderEngine image cache size in dumpsys), SurfaceFlinger_test, libsurfaceflinger_unittest Change-Id: Ib9374c02db59e09ca53280acc64419bda6827a4d --- services/surfaceflinger/ClientCache.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'services/surfaceflinger/ClientCache.cpp') diff --git a/services/surfaceflinger/ClientCache.cpp b/services/surfaceflinger/ClientCache.cpp index 16fe27c00a..a5be01c75c 100644 --- a/services/surfaceflinger/ClientCache.cpp +++ b/services/surfaceflinger/ClientCache.cpp @@ -42,7 +42,7 @@ bool ClientCache::getBuffer(const client_cache_t& cacheId, return false; } - auto& processBuffers = it->second; + auto& processBuffers = it->second.second; auto bufItr = processBuffers.find(id); if (bufItr == processBuffers.end()) { @@ -86,12 +86,14 @@ bool ClientCache::add(const client_cache_t& cacheId, const sp& bu return false; } auto [itr, success] = - mBuffers.emplace(processToken, std::unordered_map()); + mBuffers.emplace(processToken, + std::make_pair(token, + std::unordered_map())); LOG_ALWAYS_FATAL_IF(!success, "failed to insert new process into client cache"); it = itr; } - auto& processBuffers = it->second; + auto& processBuffers = it->second.second; if (processBuffers.size() > BUFFER_CACHE_MAX_SIZE) { ALOGE("failed to cache buffer: cache is full"); @@ -120,7 +122,7 @@ void ClientCache::erase(const client_cache_t& cacheId) { } } - mBuffers[processToken].erase(id); + mBuffers[processToken].second.erase(id); } for (auto& recipient : pendingErase) { @@ -180,7 +182,7 @@ void ClientCache::removeProcess(const wp& processToken) { return; } - for (auto& [id, clientCacheBuffer] : itr->second) { + for (auto& [id, clientCacheBuffer] : itr->second.second) { client_cache_t cacheId = {processToken, id}; for (auto& recipient : clientCacheBuffer.recipients) { sp erasedRecipient = recipient.promote(); -- cgit v1.2.3-59-g8ed1b