diff -r 5652acd48509 -r 42bc1e89134d emul/compact/src/main/java/java/lang/ref/ReferenceQueue.java --- a/emul/compact/src/main/java/java/lang/ref/ReferenceQueue.java Mon Feb 25 19:00:08 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -/* - * Copyright (c) 1997, 2005, 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 - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.lang.ref; - -/** - * Reference queues, to which registered reference objects are appended by the - * garbage collector after the appropriate reachability changes are detected. - * - * @author Mark Reinhold - * @since 1.2 - */ - -public class ReferenceQueue { - - /** - * 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 head = null; - private long queueLength = 0; - - boolean enqueue(Reference 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++; - lock.notifyAll(); - return true; - } - } - } - - private Reference reallyPoll() { /* Must hold lock */ - if (head != null) { - Reference r = head; - head = (r.next == r) ? null : r.next; - r.queue = NULL; - r.next = r; - queueLength--; - 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 null. - * - * @return A reference object, if one was immediately available, - * otherwise null - */ - public Reference 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. - * - *

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 timeout - * 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 null - * - * @throws IllegalArgumentException - * If the value of the timeout argument is negative - * - * @throws InterruptedException - * If the timeout wait is interrupted - */ - public Reference remove(long timeout) - throws IllegalArgumentException, InterruptedException - { - if (timeout < 0) { - throw new IllegalArgumentException("Negative timeout value"); - } - synchronized (lock) { - Reference 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 remove() throws InterruptedException { - return remove(0); - } - -}