summaryrefslogtreecommitdiffstats
path: root/luni
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-09-04 21:56:02 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-09-04 21:56:02 +0000
commitbf02b3f81048b0d81b3f0999675071c91c2f17e5 (patch)
tree3c96f16bc990aca34063c47560f1700c6ce7938d /luni
parent29e1d1de298b8c17365edb2beb2d28d76260e7e5 (diff)
parentf9ac85ca7f1a22c088b8eb9887910e7cc2e9abf8 (diff)
downloadlibcore-bf02b3f81048b0d81b3f0999675071c91c2f17e5.zip
libcore-bf02b3f81048b0d81b3f0999675071c91c2f17e5.tar.gz
libcore-bf02b3f81048b0d81b3f0999675071c91c2f17e5.tar.bz2
am f9ac85ca: am 2cc3d41f: Fix race in finalizeAllEnqueued.
* commit 'f9ac85ca7f1a22c088b8eb9887910e7cc2e9abf8': Fix race in finalizeAllEnqueued.
Diffstat (limited to 'luni')
-rw-r--r--luni/src/main/java/java/lang/ref/FinalizerReference.java8
1 files changed, 7 insertions, 1 deletions
diff --git a/luni/src/main/java/java/lang/ref/FinalizerReference.java b/luni/src/main/java/java/lang/ref/FinalizerReference.java
index 14eaae4..47dc0b4 100644
--- a/luni/src/main/java/java/lang/ref/FinalizerReference.java
+++ b/luni/src/main/java/java/lang/ref/FinalizerReference.java
@@ -98,7 +98,13 @@ public final class FinalizerReference<T> extends Reference<T> {
FinalizerReference<Sentinel> sentinelReference = (FinalizerReference<Sentinel>) r;
sentinelReference.referent = null;
sentinelReference.zombie = sentinel;
- sentinelReference.enqueueInternal();
+ // Make a single element list, then enqueue the reference on the daemon unenqueued
+ // list. This is required instead of enqueuing directly on the finalizer queue
+ // since there could be recently freed objects in the unqueued list which are not
+ // yet on the finalizer queue. This could cause the sentinel to run before the
+ // objects are finalized. b/17381967
+ sentinelReference.pendingNext = sentinelReference;
+ ReferenceQueue.add(sentinelReference);
return;
}
}