From 2ddda0b9eaec9da3579d1ffa53345172a57223b9 Mon Sep 17 00:00:00 2001 From: Digish Pandya Date: Wed, 4 Nov 2015 11:00:28 +0530 Subject: Fix HWUI Path Cache dangling pointer When precache, PathTexture is added to PathCache, and it is released after drawn if we want to clean it. But the PathCache LRU still holds the entry of the PathTexture object. When trim the cache in the end of each frame, LRU finds that its mListener is not NULL and invoke the functor, however, mListerer points to the released PathTexture object and is a dangling pointer, thus leads to crash. Smart pointer don't help here since they only manage scopes, while PathTexture is also controled by its cleanup field. The fix is to also remove the LRU entry of PathTexture*, it will also release the texture object and there won't be texture leaks. Change-Id: Iaa0621df5dc71532e9e75b38ad94384353930b95 --- libs/hwui/OpenGLRenderer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'libs/hwui/OpenGLRenderer.cpp') diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 2292ef4..9621b54 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -2325,12 +2325,15 @@ void OpenGLRenderer::drawPath(const SkPath* path, const SkPaint* paint) { PathTexture* texture = mCaches.pathCache.get(path, paint); if (!texture) return; - const AutoTexture autoCleanup(texture); const float x = texture->left - texture->offset; const float y = texture->top - texture->offset; drawPathTexture(texture, x, y, paint); + + if (texture->cleanup) { + mCaches.pathCache.remove(path, paint); + } mDirty = true; } -- cgit v1.1