From caf0df1b7f99736aed1a0b923ef278fc4fd0fcca Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Mon, 27 Apr 2009 14:32:05 -0400 Subject: [PATCH] Add call to (new) Canvas.freeCaches() in response to low-memory This is in conjunction with removing a similar call made by the browser. Now it will be centralized, and the browser's call site will be removed. --- core/java/android/app/ActivityThread.java | 3 +++ core/jni/android/graphics/Canvas.cpp | 9 +++++++-- graphics/java/android/graphics/Canvas.java | 12 +++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 09862d2705d14..3bd76a6f5abfe 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3496,6 +3496,9 @@ public final class ActivityThread { int sqliteReleased = SQLiteDatabase.releaseMemory(); EventLog.writeEvent(SQLITE_MEM_RELEASED_EVENT_LOG_TAG, sqliteReleased); } + + // Ask graphics to free up as much as possible (font/image caches) + Canvas.freeCaches(); BinderInternal.forceGc("mem"); } diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index 605e4b8af76df..bd6fea81f9f9e 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -21,6 +21,8 @@ #include "SkCanvas.h" #include "SkDevice.h" #include "SkGLCanvas.h" +#include "SkGraphics.h" +#include "SkImageRef_GlobalPool.h" #include "SkShader.h" #include "SkTemplates.h" @@ -58,8 +60,11 @@ public: return new SkGLCanvas; } - static void freeGlCaches(JNIEnv* env, jobject) { + static void freeCaches(JNIEnv* env, jobject) { + // these are called in no particular order SkGLCanvas::DeleteAllTextures(); + SkImageRef_GlobalPool::SetRAMUsed(0); + SkGraphics::SetFontCacheUsed(0); } static jboolean isOpaque(JNIEnv* env, jobject jcanvas) { @@ -933,7 +938,7 @@ static JNINativeMethod gCanvasMethods[] = { (void*) SkCanvasGlue::drawTextOnPath__StringPathFFPaint}, {"native_drawPicture", "(II)V", (void*) SkCanvasGlue::drawPicture}, - {"freeGlCaches", "()V", (void*) SkCanvasGlue::freeGlCaches} + {"freeCaches", "()V", (void*) SkCanvasGlue::freeCaches} }; #include diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 32ecd9fa49aab..06d53e3a99f9b 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -112,7 +112,9 @@ public class Canvas { * on behalf of the Canvas. Any subsequent drawing with a GL-backed Canvas * will have to recreate those resources. */ - public static native void freeGlCaches(); + public static void freeGlCaches() { + freeCaches(); + } /** * Specify a bitmap for the canvas to draw into. @@ -1405,6 +1407,14 @@ public class Canvas { finalizer(mNativeCanvas); } + /** + * Free up as much memory as possible from private caches (e.g. fonts, + * images) + * + * @hide - for now + */ + public static native void freeCaches(); + private static native int initRaster(int nativeBitmapOrZero); private static native int initGL(); private static native void native_setBitmap(int nativeCanvas, int bitmap);