< prev index next >

src/java.base/share/classes/java/lang/ref/Reference.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2016, 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. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1997, 2017, 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. Oracle designates this
*** 138,156 **** processPendingReferences(); } } } ! /* Atomically get and clear (set to null) the VM's pending list. */ private static native Reference<Object> getAndClearReferencePendingList(); ! /* Test whether the VM's pending list contains any entries. */ private static native boolean hasReferencePendingList(); ! /* Wait until the VM's pending list may be non-null. */ private static native void waitForReferencePendingList(); private static final Object processPendingLock = new Object(); private static boolean processPendingActive = false; --- 138,165 ---- processPendingReferences(); } } } ! /* ! * system property to disable clearing before enqueuing. ! */ ! private static final boolean disableClearBeforeEnqueue ! = Boolean.getBoolean("jdk.ref.disableClearBeforeEnqueue"); ! ! /* ! * Atomically get and clear (set to null) the VM's pending list. */ private static native Reference<Object> getAndClearReferencePendingList(); ! /* ! * Test whether the VM's pending list contains any entries. */ private static native boolean hasReferencePendingList(); ! /* ! * Wait until the VM's pending list may be non-null. */ private static native void waitForReferencePendingList(); private static final Object processPendingLock = new Object(); private static boolean processPendingActive = false;
*** 259,269 **** */ public void clear() { this.referent = null; } - /* -- Queue operations -- */ /** * Tells whether or not this reference object has been enqueued, either by * the program or by the garbage collector. If this reference object was --- 268,277 ----
*** 276,300 **** public boolean isEnqueued() { return (this.queue == ReferenceQueue.ENQUEUED); } /** ! * Adds this reference object to the queue with which it is registered, ! * if any. * * <p> This method is invoked only by Java code; when the garbage collector * enqueues references it does so directly, without invoking this method. * * @return <code>true</code> if this reference object was successfully * enqueued; <code>false</code> if it was already enqueued or if * it was not registered with a queue when it was created */ public boolean enqueue() { return this.queue.enqueue(this); } - /* -- Constructors -- */ Reference(T referent) { this(referent, null); } --- 284,309 ---- public boolean isEnqueued() { return (this.queue == ReferenceQueue.ENQUEUED); } /** ! * Clears this reference object and adds it to the queue with which ! * it is registered, if any. * * <p> This method is invoked only by Java code; when the garbage collector * enqueues references it does so directly, without invoking this method. * * @return <code>true</code> if this reference object was successfully * enqueued; <code>false</code> if it was already enqueued or if * it was not registered with a queue when it was created */ public boolean enqueue() { + if (!disableClearBeforeEnqueue) + this.referent = null; return this.queue.enqueue(this); } /* -- Constructors -- */ Reference(T referent) { this(referent, null); }
*** 417,423 **** public static void reachabilityFence(Object ref) { // Does nothing, because this method is annotated with @DontInline // HotSpot needs to retain the ref and not GC it before a call to this // method } - } --- 426,431 ----
< prev index next >