From ac04f4e69a6de138c5afc668a2c89b7da7ff4e6a Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 23 Jun 2016 10:21:45 -0700 Subject: Remove FD from the right Looper Bug: 29586513 Also gives BackdropFrameRenderer a direct-destroy of Choreographer since it's hammering on new Threads and we don't want to wait for the GC to release FDs. Change-Id: Id2ec0af2ee4d5304961c4ab87a104ccb92f35fc2 --- core/java/android/view/Choreographer.java | 13 +++++++++++++ .../com/android/internal/policy/BackdropFrameRenderer.java | 1 + core/jni/android_view_DisplayEventReceiver.cpp | 8 +++----- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index a865307b12bb..d3db74d1ea24 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -232,6 +232,19 @@ public final class Choreographer { return sThreadInstance.get(); } + /** Destroys the calling thread's choreographer + * @hide + */ + public static void releaseInstance() { + Choreographer old = sThreadInstance.get(); + sThreadInstance.remove(); + old.dispose(); + } + + private void dispose() { + mDisplayEventReceiver.dispose(); + } + /** * The amount of time, in milliseconds, between each frame of the animation. *

diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index 28281b3ce740..488f769cdf31 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -217,6 +217,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame synchronized (this) { // Make sure no more messages are being sent. mChoreographer = null; + Choreographer.releaseInstance(); } } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index f9936aedaa5a..a0d5904157eb 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -81,14 +81,12 @@ NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, NativeDisplayEventReceiver::~NativeDisplayEventReceiver() { JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteGlobalRef(mReceiverWeakGlobal); + ALOGV("receiver %p ~ dtor display event receiver.", this); } void NativeDisplayEventReceiver::dispose() { ALOGV("receiver %p ~ Disposing display event receiver.", this); - - if (!mReceiver.initCheck()) { - mMessageQueue->getLooper()->removeFd(mReceiver.getFd()); - } + DisplayEventDispatcher::dispose(); } void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, int32_t id, uint32_t count) { @@ -143,7 +141,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } static void nativeDispose(JNIEnv* env, jclass clazz, jlong receiverPtr) { - sp receiver = + NativeDisplayEventReceiver* receiver = reinterpret_cast(receiverPtr); receiver->dispose(); receiver->decStrong(gDisplayEventReceiverClassInfo.clazz); // drop reference held by the object -- cgit v1.2.3-59-g8ed1b