summaryrefslogtreecommitdiffstats
path: root/luni/src
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-05-07 09:10:31 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-05-07 09:10:31 +0000
commitd78ce77e7adcc844e6f507d6e394ff0354bb0ca1 (patch)
tree5eb22af8788bc17e19edf93cbdab63af56f5445d /luni/src
parent14f4875cedd807a57aacad981ec083cfa3326f03 (diff)
parentd8eb43c1072f8467ae01ab93944c1032c94c6ccc (diff)
downloadlibcore-d78ce77e7adcc844e6f507d6e394ff0354bb0ca1.zip
libcore-d78ce77e7adcc844e6f507d6e394ff0354bb0ca1.tar.gz
libcore-d78ce77e7adcc844e6f507d6e394ff0354bb0ca1.tar.bz2
am d8eb43c1: Merge "Change ReferenceQueue order from LIFO to FIFO."
* commit 'd8eb43c1072f8467ae01ab93944c1032c94c6ccc': Change ReferenceQueue order from LIFO to FIFO.
Diffstat (limited to 'luni/src')
-rw-r--r--luni/src/main/java/java/lang/ref/ReferenceQueue.java21
1 files changed, 12 insertions, 9 deletions
diff --git a/luni/src/main/java/java/lang/ref/ReferenceQueue.java b/luni/src/main/java/java/lang/ref/ReferenceQueue.java
index 2b8089c..7ddd97d 100644
--- a/luni/src/main/java/java/lang/ref/ReferenceQueue.java
+++ b/luni/src/main/java/java/lang/ref/ReferenceQueue.java
@@ -28,6 +28,7 @@ public class ReferenceQueue<T> {
private static final int NANOS_PER_MILLI = 1000000;
private Reference<? extends T> head;
+ private Reference<? extends T> tail;
/**
* Constructs a new instance of this class.
@@ -48,18 +49,16 @@ public class ReferenceQueue<T> {
return null;
}
- Reference<? extends T> ret;
+ Reference<? extends T> ret = head;
- ret = head;
-
- if (head == head.queueNext) {
+ if (head == tail) {
+ tail = null;
head = null;
} else {
head = head.queueNext;
}
ret.queueNext = null;
-
return ret;
}
@@ -133,12 +132,16 @@ public class ReferenceQueue<T> {
* reference object to be enqueued.
*/
synchronized void enqueue(Reference<? extends T> reference) {
- if (head == null) {
- reference.queueNext = reference;
+ if (tail == null) {
+ head = reference;
} else {
- reference.queueNext = head;
+ tail.queueNext = reference;
}
- head = reference;
+
+ // The newly enqueued reference becomes the new tail, and always
+ // points to itself.
+ tail = reference;
+ tail.queueNext = reference;
notify();
}