Use NativeAllocationRegistry for DisplayEventReceiver
Test: ChoreographerTests, libsurfaceflinger_unittest, CtsGraphicsTestCases, SurfaceFlinger_test, libcompositionengine_test BUG: 266121235 Change-Id: I7167e29ddf48de707f5362942aa679f0b2d001ac
This commit is contained in:
@@ -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<DisplayEventReceiver> 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<DisplayEventReceiver>(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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,13 +240,15 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject
|
||||
return reinterpret_cast<jlong>(receiver.get());
|
||||
}
|
||||
|
||||
static void nativeDispose(JNIEnv* env, jclass clazz, jlong receiverPtr) {
|
||||
NativeDisplayEventReceiver* receiver =
|
||||
reinterpret_cast<NativeDisplayEventReceiver*>(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<jlong>(reinterpret_cast<uintptr_t>(&release));
|
||||
}
|
||||
|
||||
static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) {
|
||||
sp<NativeDisplayEventReceiver> receiver =
|
||||
reinterpret_cast<NativeDisplayEventReceiver*>(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;",
|
||||
|
||||
Reference in New Issue
Block a user