From b0a41ed3dcc34a2b4026f6cc8336796f3523aa21 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 16 Aug 2013 14:44:38 -0700 Subject: [PATCH] Prevent ANR in apps using drawPath() Bug #10347089 If an app clears its path cache before stopping background tasks, it could get into an infinite loop in PathCache::trim(). Change-Id: Ieb865b762e7b00aebaba0c023769c2db286a94f5 --- libs/hwui/Caches.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index 641cbc8e7a0f4..f9cf9a24fb1c9 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -331,6 +331,11 @@ void Caches::deleteDisplayListDeferred(DisplayList* displayList) { void Caches::flush(FlushMode mode) { FLUSH_LOGD("Flushing caches (mode %d)", mode); + // We must stop tasks before clearing caches + if (mode > kFlushMode_Layers) { + tasks.stop(); + } + switch (mode) { case kFlushMode_Full: textureCache.clear(); @@ -345,7 +350,6 @@ void Caches::flush(FlushMode mode) { fontRenderer->flush(); textureCache.flush(); pathCache.clear(); - tasks.stop(); // fall through case kFlushMode_Layers: layerCache.clear();