From a8888c1b6513a6f5335e72073efc301c86467e92 Mon Sep 17 00:00:00 2001 From: Hiroshi Yamauchi Date: Fri, 2 Dec 2016 13:58:58 -0800 Subject: [PATCH] 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 --- runtime/native/java_lang_ref_FinalizerReference.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/runtime/native/java_lang_ref_FinalizerReference.cc b/runtime/native/java_lang_ref_FinalizerReference.cc index c7d06f466..ecafd0e24 100644 --- a/runtime/native/java_lang_ref_FinalizerReference.cc +++ b/runtime/native/java_lang_ref_FinalizerReference.cc @@ -31,8 +31,17 @@ static jboolean FinalizerReference_makeCircularListIfUnenqueued(JNIEnv* env, job return Runtime::Current()->GetHeap()->GetReferenceProcessor()->MakeCircularListIfUnenqueued(ref); } +static jobject FinalizerReference_getReferent(JNIEnv* env, jobject javaThis) { + ScopedFastNativeObjectAccess soa(env); + ObjPtr ref = soa.Decode(javaThis); + ObjPtr const referent = + Runtime::Current()->GetHeap()->GetReferenceProcessor()->GetReferent(soa.Self(), ref); + return soa.AddLocalReference(referent); +} + static JNINativeMethod gMethods[] = { NATIVE_METHOD(FinalizerReference, makeCircularListIfUnenqueued, "!()Z"), + NATIVE_METHOD(FinalizerReference, getReferent, "!()Ljava/lang/Object;"), }; void register_java_lang_ref_FinalizerReference(JNIEnv* env) { -- 2.11.0