diff options
-rw-r--r-- | luni/src/main/java/java/lang/ref/ReferenceQueue.java | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/luni/src/main/java/java/lang/ref/ReferenceQueue.java b/luni/src/main/java/java/lang/ref/ReferenceQueue.java index 7ddd97d..4c78fbf 100644 --- a/luni/src/main/java/java/lang/ref/ReferenceQueue.java +++ b/luni/src/main/java/java/lang/ref/ReferenceQueue.java @@ -153,9 +153,18 @@ public class ReferenceQueue<T> { if (unenqueued == null) { unenqueued = list; } else { - Reference<?> next = unenqueued.pendingNext; - unenqueued.pendingNext = list.pendingNext; - list.pendingNext = next; + // Find the last element in unenqueued. + Reference<?> last = unenqueued; + while (last.pendingNext != unenqueued) { + last = last.pendingNext; + } + // Add our list to the end. Update the pendingNext to point back to enqueued. + last.pendingNext = list; + last = list; + while (last.pendingNext != list) { + last = last.pendingNext; + } + last.pendingNext = unenqueued; } ReferenceQueue.class.notifyAll(); } |