summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2013-08-21 18:40:24 -0700
committerRomain Guy <romainguy@google.com>2013-08-21 18:42:46 -0700
commit5d923200846ed59e813373bde789d97d4ccc40b5 (patch)
treedb2f874cf61f812c4aa359f07d49525d8da82de8 /libs
parent0a8c51b1d0d66d6060afcec1eab33091d49332ae (diff)
downloadframeworks_base-5d923200846ed59e813373bde789d97d4ccc40b5.zip
frameworks_base-5d923200846ed59e813373bde789d97d4ccc40b5.tar.gz
frameworks_base-5d923200846ed59e813373bde789d97d4ccc40b5.tar.bz2
Second attempt at avoiding infinite loop in PathCache::trim()
Bug #10347089 Change-Id: I70f5a3933e848632473acc6636c88be5dc6ac430
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/PathCache.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index 25afe63..5df6408 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -214,7 +214,22 @@ void PathCache::operator()(PathDescription& entry, PathTexture*& texture) {
void PathCache::removeTexture(PathTexture* texture) {
if (texture) {
const uint32_t size = texture->width * texture->height;
- mSize -= size;
+
+ // If there is a pending task we must wait for it to return
+ // before attempting our cleanup
+ const sp<Task<SkBitmap*> >& task = texture->task();
+ if (task != NULL) {
+ SkBitmap* bitmap = task->getResult();
+ texture->clearTask();
+ } else {
+ // If there is a pending task, the path was not added
+ // to the cache and the size wasn't increased
+ if (size > mSize) {
+ ALOGE("Removing path texture of size %d will leave "
+ "the cache in an inconsistent state", size);
+ }
+ mSize -= size;
+ }
PATH_LOGD("PathCache::delete name, size, mSize = %d, %d, %d",
texture->id, size, mSize);