summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerguei Katkov <serguei.i.katkov@intel.com>2014-05-26 11:23:39 +0700
committerSerguei Katkov <serguei.i.katkov@intel.com>2014-06-02 10:41:55 +0700
commita309d76d4c9f4e5564b09708004bf4b2e3401bb3 (patch)
tree64390ebfb947779a72bf1c3cb950778d1c90b9bc
parente4283be97047a26d3476acd3863dcc386498be17 (diff)
downloadart-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.cc5
-rw-r--r--runtime/jni_internal.cc3
-rw-r--r--runtime/thread.h2
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();
}