diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index 26fda3444c4ec..edce001813350 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -27,6 +27,8 @@ import com.android.internal.annotations.VisibleForTesting; import dalvik.annotation.optimization.FastNative; +import libcore.util.NativeAllocationRegistry; + import java.lang.ref.WeakReference; /** @@ -81,11 +83,17 @@ public abstract class DisplayEventReceiver { private static native long nativeInit(WeakReference receiver, MessageQueue messageQueue, int vsyncSource, int eventRegistration, long layerHandle); - private static native void nativeDispose(long receiverPtr); + private static native long nativeGetDisplayEventReceiverFinalizer(); @FastNative private static native void nativeScheduleVsync(long receiverPtr); private static native VsyncEventData nativeGetLatestVsyncEventData(long receiverPtr); + private static final NativeAllocationRegistry sNativeAllocationRegistry = + NativeAllocationRegistry.createMalloced( + DisplayEventReceiver.class.getClassLoader(), + nativeGetDisplayEventReceiverFinalizer()); + private Runnable mFreeNativeResources; + /** * Creates a display event receiver. * @@ -118,27 +126,16 @@ public abstract class DisplayEventReceiver { mMessageQueue = looper.getQueue(); mReceiverPtr = nativeInit(new WeakReference(this), mMessageQueue, vsyncSource, eventRegistration, layerHandle); - } - - @Override - protected void finalize() throws Throwable { - try { - dispose(true); - } finally { - super.finalize(); - } + mFreeNativeResources = sNativeAllocationRegistry.registerNativeAllocation(this, + mReceiverPtr); } /** * Disposes the receiver. */ public void dispose() { - dispose(false); - } - - private void dispose(boolean finalized) { if (mReceiverPtr != 0) { - nativeDispose(mReceiverPtr); + mFreeNativeResources.run(); mReceiverPtr = 0; } mMessageQueue = null; diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index b003659affd32..4ff86d33ea491 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1386,7 +1386,6 @@ public final class SurfaceControl implements Parcelable { synchronized (mChoreographerLock) { if (mChoreographer != null) { mChoreographer.invalidate(); - // TODO(b/266121235): Use NativeAllocationRegistry to clean up Choreographer. mChoreographer = null; } } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 8855b7806cc18..b09a9c3a505de 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -240,13 +240,15 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject return reinterpret_cast(receiver.get()); } -static void nativeDispose(JNIEnv* env, jclass clazz, jlong receiverPtr) { - NativeDisplayEventReceiver* receiver = - reinterpret_cast(receiverPtr); +static void release(NativeDisplayEventReceiver* receiver) { receiver->dispose(); receiver->decStrong(gDisplayEventReceiverClassInfo.clazz); // drop reference held by the object } +static jlong nativeGetDisplayEventReceiverFinalizer(JNIEnv*, jclass) { + return static_cast(reinterpret_cast(&release)); +} + static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) { sp receiver = reinterpret_cast(receiverPtr); @@ -274,7 +276,8 @@ static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ {"nativeInit", "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;IIJ)J", (void*)nativeInit}, - {"nativeDispose", "(J)V", (void*)nativeDispose}, + {"nativeGetDisplayEventReceiverFinalizer", "()J", + (void*)nativeGetDisplayEventReceiverFinalizer}, // @FastNative {"nativeScheduleVsync", "(J)V", (void*)nativeScheduleVsync}, {"nativeGetLatestVsyncEventData", "(J)Landroid/view/DisplayEventReceiver$VsyncEventData;",