diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-09-04 21:56:02 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-09-04 21:56:02 +0000 |
commit | bf02b3f81048b0d81b3f0999675071c91c2f17e5 (patch) | |
tree | 3c96f16bc990aca34063c47560f1700c6ce7938d /luni | |
parent | 29e1d1de298b8c17365edb2beb2d28d76260e7e5 (diff) | |
parent | f9ac85ca7f1a22c088b8eb9887910e7cc2e9abf8 (diff) | |
download | libcore-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.java | 8 |
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; } } |