src/share/classes/java/util/concurrent/PriorityBlockingQueue.java
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
jdk-7161229 Cdiff src/share/classes/java/util/concurrent/PriorityBlockingQueue.java
src/share/classes/java/util/concurrent/PriorityBlockingQueue.java
Print this page
*** 33,43 ****
* http://creativecommons.org/publicdomain/zero/1.0/
*/
package java.util.concurrent;
! import java.util.concurrent.locks.*;
import java.util.*;
/**
* An unbounded {@linkplain BlockingQueue blocking queue} that uses
* the same ordering rules as class {@link PriorityQueue} and supplies
--- 33,44 ----
* http://creativecommons.org/publicdomain/zero/1.0/
*/
package java.util.concurrent;
! import java.util.concurrent.locks.Condition;
! import java.util.concurrent.locks.ReentrantLock;
import java.util.*;
/**
* An unbounded {@linkplain BlockingQueue blocking queue} that uses
* the same ordering rules as class {@link PriorityQueue} and supplies
*** 109,119 ****
* build-up. The need to back away from lock during allocation
* makes it impossible to simply wrap delegated
* java.util.PriorityQueue operations within a lock, as was done
* in a previous version of this class. To maintain
* interoperability, a plain PriorityQueue is still used during
! * serialization, which maintains compatibility at the espense of
* transiently doubling overhead.
*/
/**
* Default array capacity.
--- 110,120 ----
* build-up. The need to back away from lock during allocation
* makes it impossible to simply wrap delegated
* java.util.PriorityQueue operations within a lock, as was done
* in a previous version of this class. To maintain
* interoperability, a plain PriorityQueue is still used during
! * serialization, which maintains compatibility at the expense of
* transiently doubling overhead.
*/
/**
* Default array capacity.
*** 306,334 ****
}
/**
* Mechanics for poll(). Call only while holding lock.
*/
! private E extract() {
! E result;
int n = size - 1;
if (n < 0)
! result = null;
else {
Object[] array = queue;
! result = (E) array[0];
E x = (E) array[n];
array[n] = null;
Comparator<? super E> cmp = comparator;
if (cmp == null)
siftDownComparable(0, x, array, n);
else
siftDownUsingComparator(0, x, array, n, cmp);
size = n;
- }
return result;
}
/**
* Inserts item x at position k, maintaining heap invariant by
* promoting x up the tree until it is greater than or equal to
* its parent, or is the root.
--- 307,334 ----
}
/**
* Mechanics for poll(). Call only while holding lock.
*/
! private E dequeue() {
int n = size - 1;
if (n < 0)
! return null;
else {
Object[] array = queue;
! E result = (E) array[0];
E x = (E) array[n];
array[n] = null;
Comparator<? super E> cmp = comparator;
if (cmp == null)
siftDownComparable(0, x, array, n);
else
siftDownUsingComparator(0, x, array, n, cmp);
size = n;
return result;
}
+ }
/**
* Inserts item x at position k, maintaining heap invariant by
* promoting x up the tree until it is greater than or equal to
* its parent, or is the root.
*** 380,389 ****
--- 380,390 ----
* @param array the heap array
* @param n heap size
*/
private static <T> void siftDownComparable(int k, T x, Object[] array,
int n) {
+ if (n > 0) {
Comparable<? super T> key = (Comparable<? super T>)x;
int half = n >>> 1; // loop while a non-leaf
while (k < half) {
int child = (k << 1) + 1; // assume left child is least
Object c = array[child];
*** 396,409 ****
--- 397,412 ----
array[k] = c;
k = child;
}
array[k] = key;
}
+ }
private static <T> void siftDownUsingComparator(int k, T x, Object[] array,
int n,
Comparator<? super T> cmp) {
+ if (n > 0) {
int half = n >>> 1;
while (k < half) {
int child = (k << 1) + 1;
Object c = array[child];
int right = child + 1;
*** 414,423 ****
--- 417,427 ----
array[k] = c;
k = child;
}
array[k] = x;
}
+ }
/**
* Establishes the heap invariant (described above) in the entire tree,
* assuming nothing about the order of the elements prior to the call.
*/
*** 518,542 ****
}
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();
- E result;
try {
! result = extract();
} finally {
lock.unlock();
}
- return result;
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
E result;
try {
! while ( (result = extract()) == null)
notEmpty.await();
} finally {
lock.unlock();
}
return result;
--- 522,544 ----
}
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
! return dequeue();
} finally {
lock.unlock();
}
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
E result;
try {
! while ( (result = dequeue()) == null)
notEmpty.await();
} finally {
lock.unlock();
}
return result;
*** 546,573 ****
long nanos = unit.toNanos(timeout);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
E result;
try {
! while ( (result = extract()) == null && nanos > 0)
nanos = notEmpty.awaitNanos(nanos);
} finally {
lock.unlock();
}
return result;
}
public E peek() {
final ReentrantLock lock = this.lock;
lock.lock();
- E result;
try {
! result = size > 0 ? (E) queue[0] : null;
} finally {
lock.unlock();
}
- return result;
}
/**
* Returns the comparator used to order the elements in this queue,
* or {@code null} if this queue uses the {@linkplain Comparable
--- 548,573 ----
long nanos = unit.toNanos(timeout);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
E result;
try {
! while ( (result = dequeue()) == null && nanos > 0)
nanos = notEmpty.awaitNanos(nanos);
} finally {
lock.unlock();
}
return result;
}
public E peek() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
! return (size == 0) ? null : (E) queue[0];
} finally {
lock.unlock();
}
}
/**
* Returns the comparator used to order the elements in this queue,
* or {@code null} if this queue uses the {@linkplain Comparable
*** 647,682 ****
*
* @param o element to be removed from this queue, if present
* @return {@code true} if this queue changed as a result of the call
*/
public boolean remove(Object o) {
- boolean removed = false;
final ReentrantLock lock = this.lock;
lock.lock();
try {
int i = indexOf(o);
! if (i != -1) {
removeAt(i);
! removed = true;
! }
} finally {
lock.unlock();
}
- return removed;
}
-
/**
* Identity-based version for use in Itr.remove
*/
! private void removeEQ(Object o) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] array = queue;
! int n = size;
! for (int i = 0; i < n; i++) {
if (o == array[i]) {
removeAt(i);
break;
}
}
--- 647,678 ----
*
* @param o element to be removed from this queue, if present
* @return {@code true} if this queue changed as a result of the call
*/
public boolean remove(Object o) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
int i = indexOf(o);
! if (i == -1)
! return false;
removeAt(i);
! return true;
} finally {
lock.unlock();
}
}
/**
* Identity-based version for use in Itr.remove
*/
! void removeEQ(Object o) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] array = queue;
! for (int i = 0, n = size; i < n; i++) {
if (o == array[i]) {
removeAt(i);
break;
}
}
*** 692,710 ****
*
* @param o object to be checked for containment in this queue
* @return {@code true} if this queue contains the specified element
*/
public boolean contains(Object o) {
- int index;
final ReentrantLock lock = this.lock;
lock.lock();
try {
! index = indexOf(o);
} finally {
lock.unlock();
}
- return index != -1;
}
/**
* Returns an array containing all of the elements in this queue.
* The returned array elements are in no particular order.
--- 688,704 ----
*
* @param o object to be checked for containment in this queue
* @return {@code true} if this queue contains the specified element
*/
public boolean contains(Object o) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
! return indexOf(o) != -1;
} finally {
lock.unlock();
}
}
/**
* Returns an array containing all of the elements in this queue.
* The returned array elements are in no particular order.
*** 726,747 ****
} finally {
lock.unlock();
}
}
-
public String toString() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
int n = size;
if (n == 0)
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (int i = 0; i < n; ++i) {
! E e = (E)queue[i];
sb.append(e == this ? "(this Collection)" : e);
if (i != n - 1)
sb.append(',').append(' ');
}
return sb.append(']').toString();
--- 720,740 ----
} finally {
lock.unlock();
}
}
public String toString() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
int n = size;
if (n == 0)
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (int i = 0; i < n; ++i) {
! Object e = queue[i];
sb.append(e == this ? "(this Collection)" : e);
if (i != n - 1)
sb.append(',').append(' ');
}
return sb.append(']').toString();
*** 755,781 ****
* @throws ClassCastException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
* @throws IllegalArgumentException {@inheritDoc}
*/
public int drainTo(Collection<? super E> c) {
! if (c == null)
! throw new NullPointerException();
! if (c == this)
! throw new IllegalArgumentException();
! final ReentrantLock lock = this.lock;
! lock.lock();
! try {
! int n = 0;
! E e;
! while ( (e = extract()) != null) {
! c.add(e);
! ++n;
! }
! return n;
! } finally {
! lock.unlock();
! }
}
/**
* @throws UnsupportedOperationException {@inheritDoc}
* @throws ClassCastException {@inheritDoc}
--- 748,758 ----
* @throws ClassCastException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
* @throws IllegalArgumentException {@inheritDoc}
*/
public int drainTo(Collection<? super E> c) {
! return drainTo(c, Integer.MAX_VALUE);
}
/**
* @throws UnsupportedOperationException {@inheritDoc}
* @throws ClassCastException {@inheritDoc}
*** 790,804 ****
if (maxElements <= 0)
return 0;
final ReentrantLock lock = this.lock;
lock.lock();
try {
! int n = 0;
! E e;
! while (n < maxElements && (e = extract()) != null) {
! c.add(e);
! ++n;
}
return n;
} finally {
lock.unlock();
}
--- 767,780 ----
if (maxElements <= 0)
return 0;
final ReentrantLock lock = this.lock;
lock.lock();
try {
! int n = Math.min(size, maxElements);
! for (int i = 0; i < n; i++) {
! c.add((E) queue[0]); // In this order, in case add() throws.
! dequeue();
}
return n;
} finally {
lock.unlock();
}
*** 842,853 ****
*
* <p>Suppose {@code x} is a queue known to contain only strings.
* The following code can be used to dump the queue into a newly
* allocated array of {@code String}:
*
! * <pre>
! * String[] y = x.toArray(new String[0]);</pre>
*
* Note that {@code toArray(new Object[0])} is identical in function to
* {@code toArray()}.
*
* @param a the array into which the elements of the queue are to
--- 818,828 ----
*
* <p>Suppose {@code x} is a queue known to contain only strings.
* The following code can be used to dump the queue into a newly
* allocated array of {@code String}:
*
! * <pre> {@code String[] y = x.toArray(new String[0]);}</pre>
*
* Note that {@code toArray(new Object[0])} is identical in function to
* {@code toArray()}.
*
* @param a the array into which the elements of the queue are to
*** 896,906 ****
/**
* Snapshot iterator that works off copy of underlying q array.
*/
final class Itr implements Iterator<E> {
final Object[] array; // Array of all elements
! int cursor; // index of next element to return;
int lastRet; // index of last element, or -1 if no such
Itr(Object[] array) {
lastRet = -1;
this.array = array;
--- 871,881 ----
/**
* Snapshot iterator that works off copy of underlying q array.
*/
final class Itr implements Iterator<E> {
final Object[] array; // Array of all elements
! int cursor; // index of next element to return
int lastRet; // index of last element, or -1 if no such
Itr(Object[] array) {
lastRet = -1;
this.array = array;
*** 924,957 ****
lastRet = -1;
}
}
/**
! * Saves the state to a stream (that is, serializes it). For
! * compatibility with previous version of this class,
! * elements are first copied to a java.util.PriorityQueue,
! * which is then serialized.
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
lock.lock();
try {
! int n = size; // avoid zero capacity argument
! q = new PriorityQueue<E>(n == 0 ? 1 : n, comparator);
q.addAll(this);
s.defaultWriteObject();
} finally {
q = null;
lock.unlock();
}
}
/**
! * Reconstitutes the {@code PriorityBlockingQueue} instance from a stream
! * (that is, deserializes it).
! *
! * @param s the stream
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
try {
s.defaultReadObject();
--- 899,930 ----
lastRet = -1;
}
}
/**
! * Saves this queue to a stream (that is, serializes it).
! *
! * For compatibility with previous version of this class, elements
! * are first copied to a java.util.PriorityQueue, which is then
! * serialized.
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
lock.lock();
try {
! // avoid zero capacity argument
! q = new PriorityQueue<E>(Math.max(size, 1), comparator);
q.addAll(this);
s.defaultWriteObject();
} finally {
q = null;
lock.unlock();
}
}
/**
! * Reconstitutes this queue from a stream (that is, deserializes it).
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
try {
s.defaultReadObject();
src/share/classes/java/util/concurrent/PriorityBlockingQueue.java
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File