From fb766e49dddef1d743fd73c06dd4dee71d73378e Mon Sep 17 00:00:00 2001 From: Kim Barrett Date: Wed, 19 Apr 2017 00:29:26 -0400 Subject: [PATCH] 8178832: (ref) jdk.lang.ref.disableClearBeforeEnqueue property is ignored Delay property access to first use, and fix test. Reviewed-by: mchung --- .../share/classes/java/lang/ref/Reference.java | 8 +++++--- jdk/test/java/lang/ref/ReferenceEnqueue.java | 12 ++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/ref/Reference.java b/jdk/src/java.base/share/classes/java/lang/ref/Reference.java index d66fe1a0c34..5125e7cb553 100644 --- a/jdk/src/java.base/share/classes/java/lang/ref/Reference.java +++ b/jdk/src/java.base/share/classes/java/lang/ref/Reference.java @@ -143,8 +143,10 @@ public abstract class Reference { /* * system property to disable clearing before enqueuing. */ - private static final boolean disableClearBeforeEnqueue - = Boolean.getBoolean("jdk.lang.ref.disableClearBeforeEnqueue"); + private static final class ClearBeforeEnqueue { + static final boolean DISABLE = + Boolean.getBoolean("jdk.lang.ref.disableClearBeforeEnqueue"); + } /* * Atomically get and clear (set to null) the VM's pending list. @@ -297,7 +299,7 @@ public abstract class Reference { * it was not registered with a queue when it was created */ public boolean enqueue() { - if (!disableClearBeforeEnqueue) + if (!ClearBeforeEnqueue.DISABLE) this.referent = null; return this.queue.enqueue(this); } diff --git a/jdk/test/java/lang/ref/ReferenceEnqueue.java b/jdk/test/java/lang/ref/ReferenceEnqueue.java index e45adfa8a58..ddc89fc7f27 100644 --- a/jdk/test/java/lang/ref/ReferenceEnqueue.java +++ b/jdk/test/java/lang/ref/ReferenceEnqueue.java @@ -25,7 +25,7 @@ * @bug 4268317 8132306 8175797 * @summary Test if Reference.enqueue() works properly with GC * @run main ReferenceEnqueue - * @run main/othervm -Djdk.lang.ref.disableClearAndEnqueue=true ReferenceEnqueue + * @run main/othervm -Djdk.lang.ref.disableClearBeforeEnqueue=true ReferenceEnqueue */ import java.lang.ref.*; @@ -87,13 +87,13 @@ public class ReferenceEnqueue { final ReferenceQueue queue = new ReferenceQueue<>(); final List> refs = new ArrayList<>(); final int iterations = 1000; - final boolean disableClearAndEnqueue = - Boolean.parseBoolean("jdk.lang.ref.disableClearAndEnqueue"); + final boolean disableClearBeforeEnqueue = + Boolean.getBoolean("jdk.lang.ref.disableClearBeforeEnqueue"); ExplicitEnqueue() { this.refs.add(new SoftReference<>(new Object(), queue)); this.refs.add(new WeakReference<>(new Object(), queue)); - this.refs.add(new PhantomReference<>(new Object(), queue)); + // Can't test PhantomReference because get() always returns null. } void run() throws InterruptedException { @@ -101,10 +101,10 @@ public class ReferenceEnqueue { if (ref.enqueue() == false) { throw new RuntimeException("Error: enqueue failed"); } - if (disableClearAndEnqueue && ref.get() == null) { + if (disableClearBeforeEnqueue && ref.get() == null) { throw new RuntimeException("Error: clearing should be disabled"); } - if (!disableClearAndEnqueue && ref.get() != null) { + if (!disableClearBeforeEnqueue && ref.get() != null) { throw new RuntimeException("Error: referent must be cleared"); } }