diff options
| author | 2019-03-25 19:44:48 +0000 | |
|---|---|---|
| committer | 2019-03-25 19:44:48 +0000 | |
| commit | 1981cea3426b4b5aa8a71a6eb44ef95a32956fa8 (patch) | |
| tree | d7daf9496618c54a143616ebcf4f3b7a60f081b3 /services/surfaceflinger/BufferStateLayerCache.cpp | |
| parent | b818fa6e681a461d758a81712d9779250b4f77a5 (diff) | |
| parent | 78b7220f542826771223f9b5c0b876874dd398d2 (diff) | |
Merge "blast: drop buffer from SF's cache when destroyed"
Diffstat (limited to 'services/surfaceflinger/BufferStateLayerCache.cpp')
| -rw-r--r-- | services/surfaceflinger/BufferStateLayerCache.cpp | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/services/surfaceflinger/BufferStateLayerCache.cpp b/services/surfaceflinger/BufferStateLayerCache.cpp index cb02d16007..51ca45c53a 100644 --- a/services/surfaceflinger/BufferStateLayerCache.cpp +++ b/services/surfaceflinger/BufferStateLayerCache.cpp @@ -23,21 +23,14 @@ #include "BufferStateLayerCache.h" -#define VALID_CACHE_ID(id) ((id) >= 0 || (id) < (BUFFER_CACHE_MAX_SIZE)) - namespace android { ANDROID_SINGLETON_STATIC_INSTANCE(BufferStateLayerCache); BufferStateLayerCache::BufferStateLayerCache() : mDeathRecipient(new CacheDeathRecipient) {} -void BufferStateLayerCache::add(sp<IBinder> processToken, int32_t id, +void BufferStateLayerCache::add(const sp<IBinder>& processToken, uint64_t id, const sp<GraphicBuffer>& buffer) { - if (!VALID_CACHE_ID(id)) { - ALOGE("failed to cache buffer: invalid buffer id"); - return; - } - if (!processToken) { ALOGE("failed to cache buffer: invalid process token"); return; @@ -61,15 +54,33 @@ void BufferStateLayerCache::add(sp<IBinder> processToken, int32_t id, } auto& processBuffers = mBuffers[processToken]; + + if (processBuffers.size() > BUFFER_CACHE_MAX_SIZE) { + ALOGE("failed to cache buffer: cache is full"); + return; + } + processBuffers[id] = buffer; } -sp<GraphicBuffer> BufferStateLayerCache::get(sp<IBinder> processToken, int32_t id) { - if (!VALID_CACHE_ID(id)) { - ALOGE("failed to get buffer: invalid buffer id"); - return nullptr; +void BufferStateLayerCache::erase(const sp<IBinder>& processToken, uint64_t id) { + if (!processToken) { + ALOGE("failed to uncache buffer: invalid process token"); + return; + } + + std::lock_guard lock(mMutex); + + if (mBuffers.find(processToken) == mBuffers.end()) { + ALOGE("failed to uncache buffer: process token not found"); + return; } + auto& processBuffers = mBuffers[processToken]; + processBuffers.erase(id); +} + +sp<GraphicBuffer> BufferStateLayerCache::get(const sp<IBinder>& processToken, uint64_t id) { if (!processToken) { ALOGE("failed to cache buffer: invalid process token"); return nullptr; @@ -82,8 +93,8 @@ sp<GraphicBuffer> BufferStateLayerCache::get(sp<IBinder> processToken, int32_t i return nullptr; } - if (id >= itr->second.size()) { - ALOGE("failed to get buffer: id outside the bounds of the cache"); + if (itr->second.find(id) == itr->second.end()) { + ALOGE("failed to get buffer: buffer not found"); return nullptr; } |