8178832: (ref) jdk.lang.ref.disableClearBeforeEnqueue property is ignored

Delay property access to first use, and fix test.

Reviewed-by: mchung
This commit is contained in:
Kim Barrett 2017-04-19 00:29:26 -04:00
parent 05e16f5153
commit fb766e49dd
2 changed files with 11 additions and 9 deletions

View File

@ -143,8 +143,10 @@ public abstract class Reference<T> {
/*
* 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<T> {
* 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);
}

View File

@ -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<Object> queue = new ReferenceQueue<>();
final List<Reference<Object>> 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");
}
}