summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hiroshi Yamauchi <yamauchi@google.com> 2016-12-06 20:09:07 +0000
committer android-build-merger <android-build-merger@google.com> 2016-12-06 20:09:07 +0000
commit6ce90a2d55ff64a049baf9685d078cef83568591 (patch)
tree658a72843f052f3c9696db1f9c56adab89216d03
parent20f0ed64fd9b5218c134cf729b4d3e1f27592e8b (diff)
parentd12f04cb563432c1c072c7446255c57ec2f8db53 (diff)
Merge "Use getReferent() in enqueueSentinelReference to avoid race with GC."
am: d12f04cb56 Change-Id: I45197211253ba6308695f3bcbf339b118cfed299
-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) {