From 61ccc9198ab09363edbf500d7669dbcfafc5fa28 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Wed, 6 Apr 2016 11:32:36 -0700 Subject: [PATCH] Clear ThreadLocal storage from Choreographer Change-Id: I5abb5c68a635e7808b0a036ba4d9971cd0139aa3 --- .../src/android/view/Choreographer_Delegate.java | 16 ++++++++++++++++ .../layoutlib/bridge/impl/RenderSessionImpl.java | 1 + 2 files changed, 17 insertions(+) diff --git a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java index 01af669e39d3a..6cd67c6846f49 100644 --- a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java @@ -15,8 +15,11 @@ */ package android.view; +import com.android.ide.common.rendering.api.LayoutLog; +import com.android.layoutlib.bridge.Bridge; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; +import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicReference; /** @@ -64,4 +67,17 @@ public class Choreographer_Delegate { thisChoreographer.doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); } + + public static void dispose() { + try { + Field threadInstanceField = Choreographer.class.getDeclaredField("sThreadInstance"); + @SuppressWarnings("unchecked") ThreadLocal threadInstance = + (ThreadLocal) threadInstanceField.get(null); + threadInstance.remove(); + } catch (ReflectiveOperationException e) { + assert false; + Bridge.getLog().error(LayoutLog.TAG_BROKEN, + "Unable to clear Choreographer memory.", e, null); + } + } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index 016825ae66e21..d0b5d84092116 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -1434,6 +1434,7 @@ public class RenderSessionImpl extends RenderAction { if (createdLooper) { Bridge.cleanupThread(); + Choreographer_Delegate.dispose(); } } }