diff options
author | Mathieu Chartier <mathieuc@google.com> | 2015-01-22 17:02:27 -0800 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2015-01-23 10:59:28 -0800 |
commit | 4c4d609a3f1d67c76c855df13c2c1be9c315a6c9 (patch) | |
tree | 938783861d07d62b22fb161d9c645247720012cf /runtime/debugger.cc | |
parent | a5f74e15c14b8d2caa49a350ca6b5aa9183e2f7e (diff) | |
download | art-4c4d609a3f1d67c76c855df13c2c1be9c315a6c9.tar.gz art-4c4d609a3f1d67c76c855df13c2c1be9c315a6c9.tar.bz2 art-4c4d609a3f1d67c76c855df13c2c1be9c315a6c9.zip |
Fix compaction bugs related to IdentityHashCode
IdentityHashCode is a suspend point if monitor inflation occurs.
Change-Id: I114021aed8b3f3437109ef622298de05e13b4e34
Diffstat (limited to 'runtime/debugger.cc')
-rw-r--r-- | runtime/debugger.cc | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/runtime/debugger.cc b/runtime/debugger.cc index c63e2d735e..169aa9c717 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -105,18 +105,17 @@ class AllocRecordStackTraceElement { jobject Dbg::TypeCache::Add(mirror::Class* t) { ScopedObjectAccessUnchecked soa(Thread::Current()); - int32_t hash_code = t->IdentityHashCode(); + JNIEnv* const env = soa.Env(); + ScopedLocalRef<jobject> local_ref(soa.Env(), soa.AddLocalReference<jobject>(t)); + const int32_t hash_code = soa.Decode<mirror::Class*>(local_ref.get())->IdentityHashCode(); auto range = objects_.equal_range(hash_code); for (auto it = range.first; it != range.second; ++it) { - if (soa.Decode<mirror::Class*>(it->second) == t) { + if (soa.Decode<mirror::Class*>(it->second) == soa.Decode<mirror::Class*>(local_ref.get())) { // Found a matching weak global, return it. return it->second; } } - JNIEnv* env = soa.Env(); - const jobject local_ref = soa.AddLocalReference<jobject>(t); - const jobject weak_global = env->NewWeakGlobalRef(local_ref); - env->DeleteLocalRef(local_ref); + const jobject weak_global = env->NewWeakGlobalRef(local_ref.get()); objects_.insert(std::make_pair(hash_code, weak_global)); return weak_global; } |