From 3a5fa5ed91bf76c32913fe8149a83ba4205aa0bf Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Thu, 4 Sep 2014 14:15:35 -0700 Subject: [PATCH] Add test case for runFinalization. There was a bug causing runFinalization to return before recently freed objects were finalized. This is a regression test for this bug. Bug: 17381967 Change-Id: Ide6e2037685324423e83965fae3935f3e7f0aba6 --- test/036-finalizer/expected.txt | 1 + test/036-finalizer/src/Main.java | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/test/036-finalizer/expected.txt b/test/036-finalizer/expected.txt index a2a74fcbf..36fa5f8e7 100644 --- a/test/036-finalizer/expected.txt +++ b/test/036-finalizer/expected.txt @@ -11,3 +11,4 @@ gc + finalize sleep reborn: [FinalizerTest message=nothing, finalized=false] wimp: null +Finalized 1024 / 1024 diff --git a/test/036-finalizer/src/Main.java b/test/036-finalizer/src/Main.java index 328425f84..390472df4 100644 --- a/test/036-finalizer/src/Main.java +++ b/test/036-finalizer/src/Main.java @@ -120,6 +120,39 @@ public class Main { System.out.println("reborn: " + FinalizerTest.mReborn); System.out.println("wimp: " + wimpString(wimp)); + // Test runFinalization with multiple objects. + runFinalizationTest(); + } + + static class FinalizeCounter { + private static Object finalizeLock = new Object(); + private static volatile int finalizeCount = 0; + private int index; + static int getCount() { + return finalizeCount; + } + FinalizeCounter(int index) { + this.index = index; + } + protected void finalize() { + synchronized(finalizeLock) { + ++finalizeCount; + } + } + } + + private static void runFinalizationTest() { + int count = 1024; + Object[] objs = new Object[count]; + for (int i = 0; i < count; ++i) { + objs[i] = new FinalizeCounter(i); + } + for (int i = 0; i < count; ++i) { + objs[i] = null; + } + System.gc(); + System.runFinalization(); + System.out.println("Finalized " + FinalizeCounter.getCount() + " / " + count); } public static class FinalizerTest { -- 2.11.0