summaryrefslogtreecommitdiffstats
path: root/runtime/debugger.cc
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2015-01-22 17:02:27 -0800
committerMathieu Chartier <mathieuc@google.com>2015-01-23 10:59:28 -0800
commit4c4d609a3f1d67c76c855df13c2c1be9c315a6c9 (patch)
tree938783861d07d62b22fb161d9c645247720012cf /runtime/debugger.cc
parenta5f74e15c14b8d2caa49a350ca6b5aa9183e2f7e (diff)
downloadart-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.cc11
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;
}