diff options
| author | 2016-12-06 20:09:07 +0000 | |
|---|---|---|
| committer | 2016-12-06 20:09:07 +0000 | |
| commit | 6ce90a2d55ff64a049baf9685d078cef83568591 (patch) | |
| tree | 658a72843f052f3c9696db1f9c56adab89216d03 | |
| parent | 20f0ed64fd9b5218c134cf729b4d3e1f27592e8b (diff) | |
| parent | d12f04cb563432c1c072c7446255c57ec2f8db53 (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.cc | 9 |
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) { |