ArrayBlockingQueue.java revision bba8d1acd6dfff06c94d761c67a30154ca5ca5df
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Written by Doug Lea with assistance from members of JCP JSR-166
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Expert Group and released to the public domain, as explained at
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://creativecommons.org/licenses/publicdomain
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.concurrent;
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.concurrent.locks.*;
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.*;
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-note
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// removed link to collections framework docs
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A bounded {@linkplain BlockingQueue blocking queue} backed by an
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * array.  This queue orders elements FIFO (first-in-first-out).  The
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>head</em> of the queue is that element that has been on the
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue the longest time.  The <em>tail</em> of the queue is that
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element that has been on the queue the shortest time. New elements
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are inserted at the tail of the queue, and the queue retrieval
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operations obtain elements at the head of the queue.
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This is a classic &quot;bounded buffer&quot;, in which a
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fixed-sized array holds elements inserted by producers and
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * extracted by consumers.  Once created, the capacity cannot be
27bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * increased.  Attempts to <tt>put</tt> an element into a full queue
28bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * will result in the operation blocking; attempts to <tt>take</tt> an
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element from an empty queue will similarly block.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> This class supports an optional fairness policy for ordering
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * waiting producer and consumer threads.  By default, this ordering
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is not guaranteed. However, a queue constructed with fairness set
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to <tt>true</tt> grants threads access in FIFO order. Fairness
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * generally decreases throughput but reduces variability and avoids
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * starvation.
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
38bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>This class and its iterator implement all of the
39bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <em>optional</em> methods of the {@link Collection} and {@link
40bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Iterator} interfaces.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param <E> the type of elements held in this collection
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ArrayBlockingQueue<E> extends AbstractQueue<E>
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implements BlockingQueue<E>, java.io.Serializable {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Serialization ID. This class relies on default serialization
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * even for the items array, which is default-serialized, even if
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it is empty. Otherwise it could not be declared final, which is
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * necessary here.
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -817911632652898426L;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The queued items  */
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final E[] items;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** items index for next take, poll or remove */
60bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    private int takeIndex;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** items index for next put, offer, or add. */
62bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    private int putIndex;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Number of items in the queue */
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int count;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Concurrency control uses the classic two-condition algorithm
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * found in any textbook.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Main lock guarding all access */
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final ReentrantLock lock;
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Condition for waiting takes */
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Condition notEmpty;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Condition for waiting puts */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Condition notFull;
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Internal helper methods
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Circularly increment i.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final int inc(int i) {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (++i == items.length)? 0 : i;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
88bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Inserts element at current put position, advances, and signals.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Call only when holding lock.
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void insert(E x) {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        items[putIndex] = x;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        putIndex = inc(putIndex);
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ++count;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notEmpty.signal();
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
99bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Extracts element at current take position, advances, and signals.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Call only when holding lock.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private E extract() {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        E x = items[takeIndex];
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        items[takeIndex] = null;
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        takeIndex = inc(takeIndex);
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        --count;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notFull.signal();
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return x;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Utility for remove and iterator.remove: Delete item at position i.
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Call only when holding lock.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void removeAt(int i) {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if removing front item, just advance
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (i == takeIndex) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            items[takeIndex] = null;
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            takeIndex = inc(takeIndex);
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // slide over all others up through putIndex.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int nexti = inc(i);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nexti != putIndex) {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    items[i] = items[nexti];
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    i = nexti;
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    items[i] = null;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    putIndex = i;
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        --count;
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notFull.signal();
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * capacity and default access policy.
143bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param capacity the capacity of this queue
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ArrayBlockingQueue(int capacity) {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(capacity, false);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * capacity and the specified access policy.
154bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param capacity the capacity of this queue
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fair if <tt>true</tt> then queue accesses for threads blocked
157bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *        on insertion or removal, are processed in FIFO order;
158bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *        if <tt>false</tt> the access order is unspecified.
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ArrayBlockingQueue(int capacity, boolean fair) {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (capacity <= 0)
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.items = (E[]) new Object[capacity];
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock = new ReentrantLock(fair);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notEmpty = lock.newCondition();
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notFull =  lock.newCondition();
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * capacity, the specified access policy and initially containing the
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of the given collection,
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * added in traversal order of the collection's iterator.
175bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param capacity the capacity of this queue
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fair if <tt>true</tt> then queue accesses for threads blocked
178bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *        on insertion or removal, are processed in FIFO order;
179bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *        if <tt>false</tt> the access order is unspecified.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c the collection of elements to initially contain
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>capacity</tt> is less than
182bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *         <tt>c.size()</tt>, or less than 1.
183bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException if the specified collection or any
184bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *         of its elements are null
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ArrayBlockingQueue(int capacity, boolean fair,
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              Collection<? extends E> c) {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(capacity, fair);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (capacity < c.size())
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (Iterator<? extends E> it = c.iterator(); it.hasNext();)
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            add(it.next());
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
197bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Inserts the specified element at the tail of this queue if it is
198bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * possible to do so immediately without exceeding the queue's capacity,
199bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * returning <tt>true</tt> upon success and throwing an
200bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <tt>IllegalStateException</tt> if this queue is full.
201bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
202bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @param e the element to add
203bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return <tt>true</tt> (as specified by {@link Collection#add})
204bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws IllegalStateException if this queue is full
205bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException if the specified element is null
206bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
207bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    public boolean add(E e) {
208bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        return super.add(e);
209bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    }
210bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
211bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
212bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Inserts the specified element at the tail of this queue if it is
213bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * possible to do so immediately without exceeding the queue's capacity,
214bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * returning <tt>true</tt> upon success and <tt>false</tt> if this queue
215bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * is full.  This method is generally preferable to method {@link #add},
216bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * which can fail to insert an element only by throwing an exception.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
218bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException if the specified element is null
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
220bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    public boolean offer(E e) {
221bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        if (e == null) throw new NullPointerException();
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (count == items.length)
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else {
228bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                insert(e);
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
237bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Inserts the specified element at the tail of this queue, waiting
238bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * for space to become available if the queue is full.
239bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
240bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws InterruptedException {@inheritDoc}
241bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException {@inheritDoc}
242bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
243bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    public void put(E e) throws InterruptedException {
244bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        if (e == null) throw new NullPointerException();
245bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        final E[] items = this.items;
246bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        final ReentrantLock lock = this.lock;
247bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        lock.lockInterruptibly();
248bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        try {
249bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            try {
250bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                while (count == items.length)
251bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    notFull.await();
252bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            } catch (InterruptedException ie) {
253bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                notFull.signal(); // propagate to non-interrupted thread
254bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                throw ie;
255bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            }
256bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            insert(e);
257bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        } finally {
258bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            lock.unlock();
259bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        }
260bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    }
261bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
262bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
263bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Inserts the specified element at the tail of this queue, waiting
264bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * up to the specified wait time for space to become available if
265bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * the queue is full.
266bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
267bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws InterruptedException {@inheritDoc}
268bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException {@inheritDoc}
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
270bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    public boolean offer(E e, long timeout, TimeUnit unit)
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        if (e == null) throw new NullPointerException();
274bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        long nanos = unit.toNanos(timeout);
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lockInterruptibly();
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (count != items.length) {
280bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    insert(e);
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nanos <= 0)
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return false;
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    nanos = notFull.awaitNanos(nanos);
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (InterruptedException ie) {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    notFull.signal(); // propagate to non-interrupted thread
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw ie;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E poll() {
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (count == 0)
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            E x = extract();
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return x;
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
310bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    public E take() throws InterruptedException {
311bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        final ReentrantLock lock = this.lock;
312bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        lock.lockInterruptibly();
313bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        try {
314bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            try {
315bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                while (count == 0)
316bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    notEmpty.await();
317bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            } catch (InterruptedException ie) {
318bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                notEmpty.signal(); // propagate to non-interrupted thread
319bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                throw ie;
320bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            }
321bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            E x = extract();
322bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            return x;
323bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        } finally {
324bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            lock.unlock();
325bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        }
326bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    }
327bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E poll(long timeout, TimeUnit unit) throws InterruptedException {
329bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        long nanos = unit.toNanos(timeout);
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lockInterruptibly();
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (count != 0) {
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    E x = extract();
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return x;
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nanos <= 0)
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    nanos = notEmpty.awaitNanos(nanos);
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (InterruptedException ie) {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    notEmpty.signal(); // propagate to non-interrupted thread
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw ie;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E peek() {
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (count == 0) ? null : items[takeIndex];
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // this doc comment is overridden to remove the reference to collections
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // greater in size than Integer.MAX_VALUE
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of elements in this queue.
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
368bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return the number of elements in this queue
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return count;
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // this doc comment is a modified copy of the inherited doc comment,
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // without the reference to unlimited queues.
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
383bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Returns the number of additional elements that this queue can ideally
384bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * (in the absence of memory or resource constraints) accept without
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * blocking. This is always equal to the initial capacity of this queue
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * less the current <tt>size</tt> of this queue.
387bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
388bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <p>Note that you <em>cannot</em> always tell if an attempt to insert
389bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * an element will succeed by inspecting <tt>remainingCapacity</tt>
390bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * because it may be the case that another thread is about to
391bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * insert or remove an element.
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int remainingCapacity() {
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return items.length - count;
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
403bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
404bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Removes a single instance of the specified element from this queue,
405bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * if it is present.  More formally, removes an element <tt>e</tt> such
406bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * that <tt>o.equals(e)</tt>, if this queue contains one or more such
407bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * elements.
408bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Returns <tt>true</tt> if this queue contained the specified element
409bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * (or equivalently, if this queue changed as a result of the call).
410bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
411bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @param o element to be removed from this queue, if present
412bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return <tt>true</tt> if this queue changed as a result of the call
413bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
414bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    public boolean remove(Object o) {
415bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        if (o == null) return false;
416bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        final E[] items = this.items;
417bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        final ReentrantLock lock = this.lock;
418bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        lock.lock();
419bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        try {
420bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            int i = takeIndex;
421bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            int k = 0;
422bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            for (;;) {
423bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                if (k++ >= count)
424bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    return false;
425bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                if (o.equals(items[i])) {
426bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    removeAt(i);
427bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                    return true;
428bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                }
429bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson                i = inc(i);
430bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            }
431bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson
432bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        } finally {
433bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson            lock.unlock();
434bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson        }
435bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    }
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
437bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
438bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Returns <tt>true</tt> if this queue contains the specified element.
439bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * More formally, returns <tt>true</tt> if and only if this queue contains
440bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
441bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
442bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @param o object to be checked for containment in this queue
443bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return <tt>true</tt> if this queue contains the specified element
444bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean contains(Object o) {
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) return false;
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k++ < count) {
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (o.equals(items[i]))
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
464bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
465bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Returns an array containing all of the elements in this queue, in
466bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * proper sequence.
467bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
468bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <p>The returned array will be "safe" in that no references to it are
469bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * maintained by this queue.  (In other words, this method must allocate
470bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * a new array).  The caller is thus free to modify the returned array.
471bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
472bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <p>This method acts as bridge between array-based and collection-based
473bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * APIs.
474bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
475bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return an array containing all of the elements in this queue
476bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object[] toArray() {
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object[] a = new Object[count];
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k < count) {
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a[k++] = items[i];
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return a;
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
495bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
496bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Returns an array containing all of the elements in this queue, in
497bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * proper sequence; the runtime type of the returned array is that of
498bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * the specified array.  If the queue fits in the specified array, it
499bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * is returned therein.  Otherwise, a new array is allocated with the
500bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * runtime type of the specified array and the size of this queue.
501bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
502bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <p>If this queue fits in the specified array with room to spare
503bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * (i.e., the array has more elements than this queue), the element in
504bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * the array immediately following the end of the queue is set to
505bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <tt>null</tt>.
506bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
507bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <p>Like the {@link #toArray()} method, this method acts as bridge between
508bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * array-based and collection-based APIs.  Further, this method allows
509bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * precise control over the runtime type of the output array, and may,
510bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * under certain circumstances, be used to save allocation costs.
511bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
512bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <p>Suppose <tt>x</tt> is a queue known to contain only strings.
513bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * The following code can be used to dump the queue into a newly
514bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * allocated array of <tt>String</tt>:
515bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
516bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <pre>
517bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *     String[] y = x.toArray(new String[0]);</pre>
518bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
519bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Note that <tt>toArray(new Object[0])</tt> is identical in function to
520bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * <tt>toArray()</tt>.
521bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *
522bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @param a the array into which the elements of the queue are to
523bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *          be stored, if it is big enough; otherwise, a new array of the
524bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *          same runtime type is allocated for this purpose
525bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return an array containing all of the elements in this queue
526bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws ArrayStoreException if the runtime type of the specified array
527bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *         is not a supertype of the runtime type of every element in
528bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     *         this queue
529bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException if the specified array is null
530bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public <T> T[] toArray(T[] a) {
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (a.length < count)
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a = (T[])java.lang.reflect.Array.newInstance(
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    a.getClass().getComponentType(),
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    count
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    );
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k < count) {
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a[k++] = (T)items[i];
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (a.length > count)
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a[count] = null;
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return a;
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.toString();
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
566bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
567bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * Atomically removes all of the elements from this queue.
568bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * The queue will be empty after this call returns.
569bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = count;
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k-- > 0) {
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                items[i] = null;
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count = 0;
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            putIndex = 0;
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            takeIndex = 0;
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notFull.signalAll();
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
590bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
591bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws UnsupportedOperationException {@inheritDoc}
592bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws ClassCastException            {@inheritDoc}
593bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException          {@inheritDoc}
594bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws IllegalArgumentException      {@inheritDoc}
595bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int drainTo(Collection<? super E> c) {
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == null)
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == this)
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int n = 0;
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int max = count;
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (n < max) {
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                c.add(items[i]);
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                items[i] = null;
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ++n;
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (n > 0) {
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                count = 0;
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                putIndex = 0;
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                takeIndex = 0;
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                notFull.signalAll();
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n;
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
626bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson    /**
627bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws UnsupportedOperationException {@inheritDoc}
628bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws ClassCastException            {@inheritDoc}
629bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws NullPointerException          {@inheritDoc}
630bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @throws IllegalArgumentException      {@inheritDoc}
631bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     */
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int drainTo(Collection<? super E> c, int maxElements) {
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == null)
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == this)
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maxElements <= 0)
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int n = 0;
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int sz = count;
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int max = (maxElements < count)? maxElements : count;
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (n < max) {
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                c.add(items[i]);
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                items[i] = null;
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ++n;
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (n > 0) {
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                count -= n;
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                takeIndex = i;
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                notFull.signalAll();
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n;
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an iterator over the elements in this queue in proper sequence.
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
668bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * will never throw {@link ConcurrentModificationException},
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and guarantees to traverse elements as they existed upon
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * construction of the iterator, and may (but is not guaranteed to)
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reflect any modifications subsequent to construction.
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
673bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson     * @return an iterator over the elements in this queue in proper sequence
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Iterator<E> iterator() {
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Itr();
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Iterator for ArrayBlockingQueue
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private class Itr implements Iterator<E> {
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Index of element to be returned by next,
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * or a negative number if no such.
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int nextIndex;
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * nextItem holds on to item fields because once we claim
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that an element exists in hasNext(), we must return it in
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the following next() call even if it was in the process of
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * being removed when hasNext() was called.
700bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson         */
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private E nextItem;
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Index of element returned by most recent call to next.
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Reset to -1 if this element is deleted by a call to remove.
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int lastRet;
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Itr() {
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lastRet = -1;
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (count == 0)
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = -1;
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else {
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = takeIndex;
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextItem = items[takeIndex];
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean hasNext() {
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * No sync. We can return true by mistake here
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * only if this iterator passed across threads,
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * which we don't support anyway.
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return nextIndex >= 0;
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
729bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson         * Checks whether nextIndex is valid; if so setting nextItem.
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Stops iterator when either hits putIndex or sees null item.
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void checkNext() {
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (nextIndex == putIndex) {
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = -1;
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextItem = null;
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextItem = items[nextIndex];
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nextItem == null)
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    nextIndex = -1;
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public E next() {
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final ReentrantLock lock = ArrayBlockingQueue.this.lock;
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.lock();
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nextIndex < 0)
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new NoSuchElementException();
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lastRet = nextIndex;
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                E x = nextItem;
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = inc(nextIndex);
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                checkNext();
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return x;
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } finally {
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lock.unlock();
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void remove() {
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final ReentrantLock lock = ArrayBlockingQueue.this.lock;
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.lock();
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int i = lastRet;
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i == -1)
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new IllegalStateException();
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lastRet = -1;
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int ti = takeIndex;
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                removeAt(i);
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // back up cursor (reset to front if was first element)
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = (i == ti) ? takeIndex : i;
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                checkNext();
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } finally {
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lock.unlock();
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
779