diff options
author | 2016-12-02 13:58:58 -0800 | |
---|---|---|
committer | 2016-12-02 14:32:40 -0800 | |
commit | a8888c1b6513a6f5335e72073efc301c86467e92 (patch) | |
tree | 3228f8c9146b30cecf1cf902bfef44d4ac5f0e89 | |
parent | 5d0c3009fc56afdb4aeae5ee6dd98c3d1d2e7711 (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.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) { |