diff options
author | Serguei Katkov <serguei.i.katkov@intel.com> | 2014-05-26 11:23:39 +0700 |
---|---|---|
committer | Serguei Katkov <serguei.i.katkov@intel.com> | 2014-06-02 10:41:55 +0700 |
commit | a309d76d4c9f4e5564b09708004bf4b2e3401bb3 (patch) | |
tree | 64390ebfb947779a72bf1c3cb950778d1c90b9bc | |
parent | e4283be97047a26d3476acd3863dcc386498be17 (diff) | |
download | art-a309d76d4c9f4e5564b09708004bf4b2e3401bb3.zip art-a309d76d4c9f4e5564b09708004bf4b2e3401bb3.tar.gz art-a309d76d4c9f4e5564b09708004bf4b2e3401bb3.tar.bz2 |
Fix GC race condition in visit roots
While GC visits roots other code can change the set pending exception
due to lack of synchronization.
Change-Id: If387944ac933a66fe176df066c3a0ea52131cad4
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
-rw-r--r-- | compiler/driver/compiler_driver_test.cc | 5 | ||||
-rw-r--r-- | runtime/jni_internal.cc | 3 | ||||
-rw-r--r-- | runtime/thread.h | 2 |
3 files changed, 7 insertions, 3 deletions
diff --git a/compiler/driver/compiler_driver_test.cc b/compiler/driver/compiler_driver_test.cc index 964dfeb..ca956aa 100644 --- a/compiler/driver/compiler_driver_test.cc +++ b/compiler/driver/compiler_driver_test.cc @@ -173,7 +173,10 @@ TEST_F(CompilerDriverTest, AbstractMethodErrorStub) { env_->ExceptionClear(); jclass jlame = env_->FindClass("java/lang/AbstractMethodError"); EXPECT_TRUE(env_->IsInstanceOf(exception, jlame)); - Thread::Current()->ClearException(); + { + ScopedObjectAccess soa(Thread::Current()); + Thread::Current()->ClearException(); + } } // TODO: need check-cast test (when stub complete & we can throw/catch diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc index f1284db..9ca3c85 100644 --- a/runtime/jni_internal.cc +++ b/runtime/jni_internal.cc @@ -669,7 +669,8 @@ class JNI { } static void ExceptionClear(JNIEnv* env) { - static_cast<JNIEnvExt*>(env)->self->ClearException(); + ScopedObjectAccess soa(env); + soa.Self()->ClearException(); } static void ExceptionDescribe(JNIEnv* env) { diff --git a/runtime/thread.h b/runtime/thread.h index 88b4b0d..6569a96 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -326,7 +326,7 @@ class Thread { tlsPtr_.throw_location = throw_location; } - void ClearException() { + void ClearException() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { tlsPtr_.exception = nullptr; tlsPtr_.throw_location.Clear(); } |