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 "bounded buffer", 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