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:
parent
05e16f5153
commit
fb766e49dd
@ -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);
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user