Use getReferent() in enqueueSentinelReference to avoid race with GC.
This is the art part.
Fix a check failure due to the direct referent access that races with
the GC reference processing for CC.
Bug: 33207594
Bug: 12687968
Test: test-art-host with and without CC.
Change-Id: I3c98066d09dd98d8fddc59b6784c75843b45338b
diff --git a/runtime/native/java_lang_ref_FinalizerReference.cc b/runtime/native/java_lang_ref_FinalizerReference.cc
index c7d06f4..ecafd0e 100644
--- a/runtime/native/java_lang_ref_FinalizerReference.cc
+++ b/runtime/native/java_lang_ref_FinalizerReference.cc
@@ -31,8 +31,17 @@
return Runtime::Current()->GetHeap()->GetReferenceProcessor()->MakeCircularListIfUnenqueued(ref);
}
+static jobject FinalizerReference_getReferent(JNIEnv* env, jobject javaThis) {
+ ScopedFastNativeObjectAccess soa(env);
+ ObjPtr<mirror::Reference> ref = soa.Decode<mirror::Reference>(javaThis);
+ ObjPtr<mirror::Object> const referent =
+ Runtime::Current()->GetHeap()->GetReferenceProcessor()->GetReferent(soa.Self(), ref);
+ return soa.AddLocalReference<jobject>(referent);
+}
+
static JNINativeMethod gMethods[] = {
NATIVE_METHOD(FinalizerReference, makeCircularListIfUnenqueued, "!()Z"),
+ NATIVE_METHOD(FinalizerReference, getReferent, "!()Ljava/lang/Object;"),
};
void register_java_lang_ref_FinalizerReference(JNIEnv* env) {