# HG changeset patch # User smarks # Date 1414716490 25200 # Node ID 89b967c599ce0f126806b45673954abef82e3aee # Parent 948cceef81ba4cb34bc233e7cc5952951ff04e88 4354680: Runtime.runFinalization() silently clears interrupted flag in the calling thread Reviewed-by: dholmes, chegar diff -r 948cceef81ba -r 89b967c599ce jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java --- a/jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java Wed Jul 05 20:06:12 2017 +0200 +++ b/jdk/src/java.base/share/classes/java/lang/ref/Finalizer.java Thu Oct 30 17:48:10 2014 -0700 @@ -122,18 +122,18 @@ 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 @@ 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 @@ 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 @@ super(g, "Finalizer"); } public void run() { + // in case of recursive call to run() if (running) return; diff -r 948cceef81ba -r 89b967c599ce jdk/test/java/lang/System/finalization/FinInterrupt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/finalization/FinInterrupt.java Thu Oct 30 17:48:10 2014 -0700 @@ -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"); + } + } +}