/*
* %W% %E%
*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.lang.ref;
/**
* Reference queues, to which registered reference objects are appended by the
* garbage collector after the appropriate reachability changes are detected.
*
* @version %I%, %G%
* @author Mark Reinhold
* @since 1.2
*/
public class ReferenceQueue<T> {
// /**
// * Constructs a new reference-object queue.
// */
// public ReferenceQueue() {
// }
//
private static class Null extends ReferenceQueue {
boolean enqueue(Reference r) {
return false;
}
}
static ReferenceQueue NULL = new Null();
// static ReferenceQueue ENQUEUED = new Null();
//
// static private class Lock {
// };
//
// private Lock lock = new Lock();
// private volatile Reference<? extends T> head = null;
// private long queueLength = 0;
//
// boolean enqueue(Reference<? extends T> r) { /*
// * Called only by Reference
// * class
// */
// synchronized (r) {
// if (r.queue == ENQUEUED)
// return false;
// synchronized (lock) {
// r.queue = ENQUEUED;
// r.next = (head == null) ? r : head;
// head = r;
// queueLength++;
// if (r instanceof FinalReference) {
// sun.misc.VM.addFinalRefCount(1);
// }
// lock.notifyAll();
// return true;
// }
// }
// }
//
// private Reference<? extends T> reallyPoll() { /* Must hold lock */
// if (head != null) {
// Reference<? extends T> r = head;
// head = (r.next == r) ? null : r.next;
// r.queue = NULL;
// r.next = r;
// queueLength--;
// if (r instanceof FinalReference) {
// sun.misc.VM.addFinalRefCount(-1);
// }
// return r;
// }
// return null;
// }
//
// /**
// * Polls this queue to see if a reference object is available. If one is
// * available without further delay then it is removed from the queue and
// * returned. Otherwise this method immediately returns <tt>null</tt>.
// *
// * @return A reference object, if one was immediately available, otherwise
// * <code>null</code>
// */
// public Reference<? extends T> poll() {
// if (head == null)
// return null;
// synchronized (lock) {
// return reallyPoll();
// }
// }
//
// /**
// * Removes the next reference object in this queue, blocking until either
// * one becomes available or the given timeout period expires.
// *
// * <p>
// * This method does not offer real-time guarantees: It schedules the
// timeout
// * as if by invoking the {@link Object#wait(long)} method.
// *
// * @param timeout
// * If positive, block for up to <code>timeout</code> milliseconds
// * while waiting for a reference to be added to this queue. If
// * zero, block indefinitely.
// *
// * @return A reference object, if one was available within the specified
// * timeout period, otherwise <code>null</code>
// *
// * @throws IllegalArgumentException
// * If the value of the timeout argument is negative
// *
// * @throws InterruptedException
// * If the timeout wait is interrupted
// */
// public Reference<? extends T> remove(long timeout)
// throws IllegalArgumentException, InterruptedException {
// if (timeout < 0) {
// throw new IllegalArgumentException("Negative timeout value");
// }
// synchronized (lock) {
// Reference<? extends T> r = reallyPoll();
// if (r != null)
// return r;
// for (;;) {
// lock.wait(timeout);
// r = reallyPoll();
// if (r != null)
// return r;
// if (timeout != 0)
// return null;
// }
// }
// }
//
// /**
// * Removes the next reference object in this queue, blocking until one
// * becomes available.
// *
// * @return A reference object, blocking until one becomes available
// * @throws InterruptedException
// * If the wait is interrupted
// */
// public Reference<? extends T> remove() throws InterruptedException {
// return remove(0);
// }
}