From 27f0b17d853d8bef918c3d869044e50cf3904ee3 Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Fri, 22 Oct 2010 08:52:33 -0700 Subject: [PATCH] Fix native resource leak when OpenGL renderer is not being used. Native resources (bitmaps, matrices, paints, shaders) are shared when display lists are used, and a refcounting system is in place to take care of disposing when all clients are finished with them. But the cache where these refcounts are tracked is not enabled when the Open GL renderer is not being used. This results in the native destructors not being called, and the resources are leaked. Change-Id: Ic7aeb55e4636dcad229846601407e596160346e6 --- core/jni/android/graphics/Bitmap.cpp | 8 ++++---- core/jni/android/graphics/Matrix.cpp | 4 ++-- core/jni/android/graphics/Paint.cpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index f8a80b068954a..8956e39af99f1 100644 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -256,20 +256,20 @@ static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) { #ifdef USE_OPENGL_RENDERER if (android::uirenderer::Caches::hasInstance()) { android::uirenderer::Caches::getInstance().resourceCache.destructor(bitmap); + return; } -#else // !USE_OPENGL_RENDERER +#endif // USE_OPENGL_RENDERER delete bitmap; -#endif } static void Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) { #ifdef USE_OPENGL_RENDERER if (android::uirenderer::Caches::hasInstance()) { android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap); + return; } -#else // !USE_OPENGL_RENDERER - bitmap->setPixels(NULL, NULL); #endif // USE_OPENGL_RENDERER + bitmap->setPixels(NULL, NULL); } // These must match the int values in Bitmap.java diff --git a/core/jni/android/graphics/Matrix.cpp b/core/jni/android/graphics/Matrix.cpp index 666775641e868..b30550606be29 100644 --- a/core/jni/android/graphics/Matrix.cpp +++ b/core/jni/android/graphics/Matrix.cpp @@ -35,10 +35,10 @@ public: #ifdef USE_OPENGL_RENDERER if (android::uirenderer::Caches::hasInstance()) { android::uirenderer::Caches::getInstance().resourceCache.destructor(obj); + return; } -#else // !USE_OPENGL_RENDERER +#endif // USE_OPENGL_RENDERER delete obj; -#endif } static SkMatrix* create(JNIEnv* env, jobject clazz, const SkMatrix* src) { diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 339c1a4a3a17f..79a02f106d826 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -66,10 +66,10 @@ public: #ifdef USE_OPENGL_RENDERER if (android::uirenderer::Caches::hasInstance()) { android::uirenderer::Caches::getInstance().resourceCache.destructor(obj); + return; } -#else // !USE_OPENGL_RENDERER +#endif // USE_OPENGL_RENDERER delete obj; -#endif } static SkPaint* init(JNIEnv* env, jobject clazz) {