summaryrefslogtreecommitdiff
path: root/libs/hwui/TextDropShadowCache.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2016-01-29 15:54:10 -0800
committerJohn Reck <jreck@google.com>2016-01-29 16:26:35 -0800
commitc3127a78b996a540cd002e5a87861e8a2adeb336 (patch)
treecef0dcfda419701814f065aa69660c871938397d /libs/hwui/TextDropShadowCache.cpp
parentf3e5d1d483231d615f5e77032f787fcd8047488b (diff)
Fix TextDropShadowCache infinite loop
Bug: 26862239 Switch TextDropCacheShadow to use the tracked objectSize() instead of the optional bitmapSize. A mismatch here results in ::get() infinite looping trying to free space in the cache since the LRU removal callback would always decrement mSize by 0 since bitmapSize was not being set. Also prevent the infinite loop in the future by crashing if this scenario happens again. Change-Id: Ib4e9fbe1c8327af2335ad650fd694a1627d9824f
Diffstat (limited to 'libs/hwui/TextDropShadowCache.cpp')
-rw-r--r--libs/hwui/TextDropShadowCache.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp
index 62a20fcfa699..1707468f169d 100644
--- a/libs/hwui/TextDropShadowCache.cpp
+++ b/libs/hwui/TextDropShadowCache.cpp
@@ -148,7 +148,7 @@ void TextDropShadowCache::setMaxSize(uint32_t maxSize) {
void TextDropShadowCache::operator()(ShadowText&, ShadowTexture*& texture) {
if (texture) {
- mSize -= texture->bitmapSize;
+ mSize -= texture->objectSize();
if (mDebugEnabled) {
ALOGD("Shadow texture deleted, size = %d", texture->bitmapSize);
@@ -195,7 +195,9 @@ ShadowTexture* TextDropShadowCache::get(const SkPaint* paint, const char* glyphs
// Don't even try to cache a bitmap that's bigger than the cache
if (size < mMaxSize) {
while (mSize + size > mMaxSize) {
- mCache.removeOldest();
+ LOG_ALWAYS_FATAL_IF(!mCache.removeOldest(),
+ "Failed to remove oldest from cache. mSize = %"
+ PRIu32 ", mCache.size() = %zu", mSize, mCache.size());
}
}
@@ -212,7 +214,7 @@ ShadowTexture* TextDropShadowCache::get(const SkPaint* paint, const char* glyphs
entry.copyTextLocally();
- mSize += size;
+ mSize += texture->objectSize();
mCache.put(entry, texture);
} else {
texture->cleanup = true;