From b99fff5d485ceb9bbf2fce43c727f547c2fc753f Mon Sep 17 00:00:00 2001 From: John Reck Date: Wed, 16 Nov 2016 15:21:57 -0800 Subject: [PATCH] Switch back to NativeAllocationRegistry Bug: 32881864 Partial revert of 3acf0382da22cda88234e599cd81b1ff5441cc35 Test: none Change-Id: Ie749e0ef0a84ff820b1ea445422cf28112d62209 --- core/java/android/view/RenderNode.java | 27 ++++++++++++-------------- core/jni/android_view_RenderNode.cpp | 5 ----- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index 7a3c95e004c58..8eca43158ef2e 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -26,6 +26,8 @@ import android.graphics.drawable.AnimatedVectorDrawable; import dalvik.annotation.optimization.FastNative; +import libcore.util.NativeAllocationRegistry; + /** *

A display list records a series of graphics related operations and can replay * them later. Display lists are usually built by recording operations on a @@ -130,13 +132,20 @@ import dalvik.annotation.optimization.FastNative; */ public class RenderNode { + // Use a Holder to allow static initialization in the boot image. + private static class NoImagePreloadHolder { + public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( + RenderNode.class.getClassLoader(), nGetNativeFinalizer(), 1024); + } + private boolean mValid; // Do not access directly unless you are ThreadedRenderer - long mNativeRenderNode; + final long mNativeRenderNode; private final View mOwningView; private RenderNode(String name, View owningView) { mNativeRenderNode = nCreate(name); + NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeRenderNode); mOwningView = owningView; } @@ -145,6 +154,7 @@ public class RenderNode { */ private RenderNode(long nativePtr) { mNativeRenderNode = nativePtr; + NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeRenderNode); mOwningView = null; } @@ -154,19 +164,7 @@ public class RenderNode { * is not feasible. */ public void destroy() { - if (mNativeRenderNode != 0) { - nFinalize(mNativeRenderNode); - mNativeRenderNode = 0; - } - } - - @Override - protected void finalize() throws Throwable { - try { - destroy(); - } finally { - super.finalize(); - } + // TODO: Removed temporarily } /** @@ -835,7 +833,6 @@ public class RenderNode { // Intentionally not static because it acquires a reference to 'this' private native long nCreate(String name); - private native void nFinalize(long renderNode); private static native long nGetNativeFinalizer(); private static native void nSetDisplayList(long renderNode, long newData); diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index f88de51a9a127..dd2a7a98b7a07 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -124,10 +124,6 @@ static void releaseRenderNode(RenderNode* renderNode) { renderNode->decStrong(0); } -static void android_view_RenderNode_finalize(JNIEnv* env, jobject clazz, jlong renderNodePtr) { - releaseRenderNode(reinterpret_cast(renderNodePtr)); -} - static jlong android_view_RenderNode_getNativeFinalizer(JNIEnv* env, jobject clazz) { return static_cast(reinterpret_cast(&releaseRenderNode)); @@ -654,7 +650,6 @@ static const JNINativeMethod gMethods[] = { // Regular JNI // ---------------------------------------------------------------------------- { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create }, - { "nFinalize", "(J)V", (void*) android_view_RenderNode_finalize }, { "nGetNativeFinalizer", "()J", (void*) android_view_RenderNode_getNativeFinalizer }, { "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList }, { "nOutput", "(J)V", (void*) android_view_RenderNode_output },