summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hiroshi Yamauchi <yamauchi@google.com> 2016-12-02 13:58:58 -0800
committer Hiroshi Yamauchi <yamauchi@google.com> 2016-12-02 14:32:40 -0800
commita8888c1b6513a6f5335e72073efc301c86467e92 (patch)
tree3228f8c9146b30cecf1cf902bfef44d4ac5f0e89
parent5d0c3009fc56afdb4aeae5ee6dd98c3d1d2e7711 (diff)
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
-rw-r--r--runtime/native/java_lang_ref_FinalizerReference.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/runtime/native/java_lang_ref_FinalizerReference.cc b/runtime/native/java_lang_ref_FinalizerReference.cc
index c7d06f4665..ecafd0e241 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<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) {