From 56b800bfea930c12121f7c671f9a1062999df2cd Mon Sep 17 00:00:00 2001 From: vadimt Date: Fri, 25 Oct 2019 18:12:25 -0700 Subject: [PATCH] Reducing chances for the object with finalizer to be reffed by register As suggested in b/143155020#comment27 Bug: 143155020 Change-Id: I4ed87a003fcd7afde213014fc1ba8b004500e71a --- .../testing/TestInformationHandler.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/com/android/launcher3/testing/TestInformationHandler.java b/src/com/android/launcher3/testing/TestInformationHandler.java index 140a06a6f5..64df384da1 100644 --- a/src/com/android/launcher3/testing/TestInformationHandler.java +++ b/src/com/android/launcher3/testing/TestInformationHandler.java @@ -24,9 +24,10 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.os.Bundle; import android.os.Debug; -import android.util.Log; import android.view.View; +import androidx.annotation.Keep; + import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Launcher; @@ -186,6 +187,22 @@ public class TestInformationHandler implements ResourceBasedOverride { Runtime.getRuntime().runFinalization(); final CountDownLatch fence = new CountDownLatch(1); + createFinalizationObserver(fence); + try { + do { + Runtime.getRuntime().gc(); + Runtime.getRuntime().runFinalization(); + } while (!fence.await(100, TimeUnit.MILLISECONDS)); + } catch (InterruptedException ex) { + throw new RuntimeException(ex); + } + } + + // Create the observer in the scope of a method to minimize the chance that + // it remains live in a DEX/machine register at the point of the fence guard. + // This must be kept to avoid R8 inlining it. + @Keep + private static void createFinalizationObserver(CountDownLatch fence) { new Object() { @Override protected void finalize() throws Throwable { @@ -196,13 +213,5 @@ public class TestInformationHandler implements ResourceBasedOverride { } } }; - try { - do { - Runtime.getRuntime().gc(); - Runtime.getRuntime().runFinalization(); - } while (!fence.await(100, TimeUnit.MILLISECONDS)); - } catch (InterruptedException ex) { - throw new RuntimeException(ex); - } } }