diff --git a/src/share/classes/java/lang/ref/Finalizer.java b/src/share/classes/java/lang/ref/Finalizer.java index f37b3e79b9caf430257fa5bc539bf4e65ed23f05..6ae2262c5aa2914d9c70358c4ef808195c4162db 100644 --- a/src/share/classes/java/lang/ref/Finalizer.java +++ b/src/share/classes/java/lang/ref/Finalizer.java @@ -122,18 +122,18 @@ final class Finalizer extends FinalReference { /* Package-private; must AccessController.doPrivileged( new PrivilegedAction() { public Void run() { - ThreadGroup tg = Thread.currentThread().getThreadGroup(); - for (ThreadGroup tgn = tg; - tgn != null; - tg = tgn, tgn = tg.getParent()); - Thread sft = new Thread(tg, proc, "Secondary finalizer"); - sft.start(); - try { - sft.join(); - } catch (InterruptedException x) { - /* Ignore */ - } - return null; + ThreadGroup tg = Thread.currentThread().getThreadGroup(); + for (ThreadGroup tgn = tg; + tgn != null; + tg = tgn, tgn = tg.getParent()); + Thread sft = new Thread(tg, proc, "Secondary finalizer"); + sft.start(); + try { + sft.join(); + } catch (InterruptedException x) { + Thread.currentThread().interrupt(); + } + return null; }}); } @@ -146,6 +146,7 @@ final class Finalizer extends FinalReference { /* Package-private; must forkSecondaryFinalizer(new Runnable() { private volatile boolean running; public void run() { + // in case of recursive call to run() if (running) return; final JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); @@ -168,6 +169,7 @@ final class Finalizer extends FinalReference { /* Package-private; must forkSecondaryFinalizer(new Runnable() { private volatile boolean running; public void run() { + // in case of recursive call to run() if (running) return; final JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); @@ -189,6 +191,7 @@ final class Finalizer extends FinalReference { /* Package-private; must super(g, "Finalizer"); } public void run() { + // in case of recursive call to run() if (running) return; diff --git a/test/java/lang/System/finalization/FinInterrupt.java b/test/java/lang/System/finalization/FinInterrupt.java new file mode 100644 index 0000000000000000000000000000000000000000..4376768e595b38d462f30248baaf8faf8ee257cb --- /dev/null +++ b/test/java/lang/System/finalization/FinInterrupt.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4354680 + * @summary runFinalization() should not clear or ignore interrupt bit + * @run main FinInterrupt + */ + +public class FinInterrupt { + public static void main(String[] args) throws Exception { + Thread.currentThread().interrupt(); + System.runFinalization(); + if (Thread.interrupted()) { + System.out.println("Passed: interrupt bit was still set."); + } else { + throw new AssertionError("interrupt bit was cleared"); + } + } +}