ArrayBlockingQueue.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * increased.  Attempts to offer an element to a full queue will
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * result in the offer operation blocking; attempts to retrieve 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 *
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This class implements all of the <em>optional</em> methods
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the {@link Collection} and {@link Iterator} interfaces.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param <E> the type of elements held in this collection
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ArrayBlockingQueue<E> extends AbstractQueue<E>
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implements BlockingQueue<E>, java.io.Serializable {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Serialization ID. This class relies on default serialization
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * even for the items array, which is default-serialized, even if
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it is empty. Otherwise it could not be declared final, which is
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * necessary here.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -817911632652898426L;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The queued items  */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final E[] items;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** items index for next take, poll or remove */
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient int takeIndex;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** items index for next put, offer, or add. */
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private transient int putIndex;
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Number of items in the queue */
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int count;
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Concurrency control uses the classic two-condition algorithm
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * found in any textbook.
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Main lock guarding all access */
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final ReentrantLock lock;
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Condition for waiting takes */
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Condition notEmpty;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** Condition for waiting puts */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Condition notFull;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Internal helper methods
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Circularly increment i.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final int inc(int i) {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (++i == items.length)? 0 : i;
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Insert element at current put position, advance, and signal.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Call only when holding lock.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void insert(E x) {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        items[putIndex] = x;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        putIndex = inc(putIndex);
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ++count;
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notEmpty.signal();
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Extract element at current take position, advance, and signal.
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Call only when holding lock.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private E extract() {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        E x = items[takeIndex];
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        items[takeIndex] = null;
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        takeIndex = inc(takeIndex);
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        --count;
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notFull.signal();
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return x;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Utility for remove and iterator.remove: Delete item at position i.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Call only when holding lock.
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void removeAt(int i) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if removing front item, just advance
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (i == takeIndex) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            items[takeIndex] = null;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            takeIndex = inc(takeIndex);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // slide over all others up through putIndex.
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int nexti = inc(i);
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nexti != putIndex) {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    items[i] = items[nexti];
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    i = nexti;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    items[i] = null;
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    putIndex = i;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    break;
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        --count;
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notFull.signal();
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * capacity and default access policy.
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param capacity the capacity of this queue
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ArrayBlockingQueue(int capacity) {
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(capacity, false);
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * capacity and the specified access policy.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param capacity the capacity of this queue
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fair if <tt>true</tt> then queue accesses for threads blocked
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on insertion or removal, are processed in FIFO order; if <tt>false</tt>
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the access order is unspecified.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ArrayBlockingQueue(int capacity, boolean fair) {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (capacity <= 0)
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.items = (E[]) new Object[capacity];
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock = new ReentrantLock(fair);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notEmpty = lock.newCondition();
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notFull =  lock.newCondition();
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed)
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * capacity, the specified access policy and initially containing the
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * elements of the given collection,
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * added in traversal order of the collection's iterator.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param capacity the capacity of this queue
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fair if <tt>true</tt> then queue accesses for threads blocked
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on insertion or removal, are processed in FIFO order; if <tt>false</tt>
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the access order is unspecified.
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c the collection of elements to initially contain
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException if <tt>capacity</tt> is less than
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>c.size()</tt>, or less than 1.
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if <tt>c</tt> or any element within it
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is <tt>null</tt>
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ArrayBlockingQueue(int capacity, boolean fair,
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                              Collection<? extends E> c) {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(capacity, fair);
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (capacity < c.size())
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (Iterator<? extends E> it = c.iterator(); it.hasNext();)
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            add(it.next());
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Inserts the specified element at the tail of this queue if possible,
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returning immediately if this queue is full.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o the element to add.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <tt>true</tt> if it was possible to add the element to
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         this queue, else <tt>false</tt>
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if the specified element is <tt>null</tt>
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean offer(E o) {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) throw new NullPointerException();
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (count == items.length)
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else {
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                insert(o);
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Inserts the specified element at the tail of this queue, waiting if
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * necessary up to the specified wait time for space to become available.
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o the element to add
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout how long to wait before giving up, in units of
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>unit</tt>
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param unit a <tt>TimeUnit</tt> determining how to interpret the
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <tt>timeout</tt> parameter
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <tt>true</tt> if successful, or <tt>false</tt> if
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified waiting time elapses before space is available.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InterruptedException if interrupted while waiting.
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if the specified element is <tt>null</tt>.
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean offer(E o, long timeout, TimeUnit unit)
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InterruptedException {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) throw new NullPointerException();
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lockInterruptibly();
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long nanos = unit.toNanos(timeout);
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (count != items.length) {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    insert(o);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nanos <= 0)
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return false;
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    nanos = notFull.awaitNanos(nanos);
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (InterruptedException ie) {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    notFull.signal(); // propagate to non-interrupted thread
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw ie;
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E poll() {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (count == 0)
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            E x = extract();
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return x;
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E poll(long timeout, TimeUnit unit) throws InterruptedException {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lockInterruptibly();
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long nanos = unit.toNanos(timeout);
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (count != 0) {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    E x = extract();
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return x;
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nanos <= 0)
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    nanos = notEmpty.awaitNanos(nanos);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (InterruptedException ie) {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    notEmpty.signal(); // propagate to non-interrupted thread
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw ie;
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean remove(Object o) {
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) return false;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (;;) {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (k++ >= count)
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return false;
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (o.equals(items[i])) {
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    removeAt(i);
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E peek() {
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (count == 0) ? null : items[takeIndex];
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public E take() throws InterruptedException {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lockInterruptibly();
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (count == 0)
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    notEmpty.await();
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (InterruptedException ie) {
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                notEmpty.signal(); // propagate to non-interrupted thread
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw ie;
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            E x = extract();
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return x;
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds the specified element to the tail of this queue, waiting if
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * necessary for space to become available.
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o the element to add
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InterruptedException if interrupted while waiting.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException if the specified element is <tt>null</tt>.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(E o) throws InterruptedException {
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) throw new NullPointerException();
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lockInterruptibly();
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while (count == items.length)
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    notFull.await();
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (InterruptedException ie) {
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                notFull.signal(); // propagate to non-interrupted thread
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw ie;
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            insert(o);
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // this doc comment is overridden to remove the reference to collections
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // greater in size than Integer.MAX_VALUE
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of elements in this queue.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return  the number of elements in this queue.
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return count;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // this doc comment is a modified copy of the inherited doc comment,
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // without the reference to unlimited queues.
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of elements that this queue can ideally (in
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the absence of memory or resource constraints) accept without
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * blocking. This is always equal to the initial capacity of this queue
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * less the current <tt>size</tt> of this queue.
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>Note that you <em>cannot</em> always tell if
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * an attempt to <tt>add</tt> an element will succeed by
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inspecting <tt>remainingCapacity</tt> because it may be the
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * case that a waiting consumer is ready to <tt>take</tt> an
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * element out of an otherwise full queue.
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the remaining capacity
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int remainingCapacity() {
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return items.length - count;
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean contains(Object o) {
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (o == null) return false;
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k++ < count) {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (o.equals(items[i]))
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object[] toArray() {
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Object[] a = new Object[count];
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k < count) {
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a[k++] = items[i];
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return a;
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public <T> T[] toArray(T[] a) {
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (a.length < count)
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a = (T[])java.lang.reflect.Array.newInstance(
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    a.getClass().getComponentType(),
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    count
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    );
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = 0;
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k < count) {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a[k++] = (T)items[i];
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (a.length > count)
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                a[count] = null;
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return a;
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.toString();
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int k = count;
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (k-- > 0) {
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                items[i] = null;
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            count = 0;
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            putIndex = 0;
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            takeIndex = 0;
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notFull.signalAll();
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int drainTo(Collection<? super E> c) {
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == null)
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == this)
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int n = 0;
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int max = count;
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (n < max) {
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                c.add(items[i]);
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                items[i] = null;
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ++n;
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (n > 0) {
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                count = 0;
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                putIndex = 0;
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                takeIndex = 0;
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                notFull.signalAll();
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n;
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int drainTo(Collection<? super E> c, int maxElements) {
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == null)
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == this)
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException();
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (maxElements <= 0)
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final E[] items = this.items;
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = takeIndex;
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int n = 0;
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int sz = count;
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int max = (maxElements < count)? maxElements : count;
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (n < max) {
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                c.add(items[i]);
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                items[i] = null;
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i = inc(i);
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ++n;
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (n > 0) {
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                count -= n;
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                takeIndex = i;
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                notFull.signalAll();
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return n;
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an iterator over the elements in this queue in proper sequence.
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will never throw {@link java.util.ConcurrentModificationException},
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and guarantees to traverse elements as they existed upon
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * construction of the iterator, and may (but is not guaranteed to)
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reflect any modifications subsequent to construction.
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an iterator over the elements in this queue in proper sequence.
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Iterator<E> iterator() {
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final ReentrantLock lock = this.lock;
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        lock.lock();
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Itr();
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.unlock();
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Iterator for ArrayBlockingQueue
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private class Itr implements Iterator<E> {
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Index of element to be returned by next,
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * or a negative number if no such.
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int nextIndex;
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * nextItem holds on to item fields because once we claim
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that an element exists in hasNext(), we must return it in
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the following next() call even if it was in the process of
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * being removed when hasNext() was called.
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         **/
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private E nextItem;
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Index of element returned by most recent call to next.
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Reset to -1 if this element is deleted by a call to remove.
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int lastRet;
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Itr() {
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lastRet = -1;
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (count == 0)
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = -1;
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else {
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = takeIndex;
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextItem = items[takeIndex];
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean hasNext() {
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * No sync. We can return true by mistake here
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * only if this iterator passed across threads,
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * which we don't support anyway.
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return nextIndex >= 0;
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Check whether nextIndex is valid; if so setting nextItem.
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Stops iterator when either hits putIndex or sees null item.
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void checkNext() {
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (nextIndex == putIndex) {
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = -1;
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextItem = null;
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextItem = items[nextIndex];
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nextItem == null)
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    nextIndex = -1;
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public E next() {
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final ReentrantLock lock = ArrayBlockingQueue.this.lock;
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.lock();
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (nextIndex < 0)
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new NoSuchElementException();
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lastRet = nextIndex;
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                E x = nextItem;
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = inc(nextIndex);
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                checkNext();
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return x;
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } finally {
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lock.unlock();
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void remove() {
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final ReentrantLock lock = ArrayBlockingQueue.this.lock;
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            lock.lock();
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int i = lastRet;
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i == -1)
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new IllegalStateException();
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lastRet = -1;
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int ti = takeIndex;
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                removeAt(i);
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // back up cursor (reset to front if was first element)
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                nextIndex = (i == ti) ? takeIndex : i;
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                checkNext();
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } finally {
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lock.unlock();
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
688