Move LockOwnerFromThreadLock into monitor.cc, the only place it's needed.
Change-Id: I2836cc96fb7d8d46f237dc403e19c50fc0f19d49
diff --git a/src/monitor.cc b/src/monitor.cc
index 50deba6..dde67ea 100644
--- a/src/monitor.cc
+++ b/src/monitor.cc
@@ -32,6 +32,7 @@
#include "stl_util.h"
#include "thread.h"
#include "thread_list.h"
+#include "well_known_classes.h"
namespace art {
@@ -823,6 +824,24 @@
}
}
+static uint32_t LockOwnerFromThreadLock(Object* thread_lock) {
+ if (thread_lock == NULL || thread_lock->GetClass() != WellKnownClasses::ToClass(WellKnownClasses::java_lang_ThreadLock)) {
+ return ThreadList::kInvalidId;
+ }
+ Field* thread_field = DecodeField(WellKnownClasses::java_lang_ThreadLock_thread);
+ Object* managed_thread = thread_field->GetObject(thread_lock);
+ if (managed_thread == NULL) {
+ return ThreadList::kInvalidId;
+ }
+ Field* vmData_field = DecodeField(WellKnownClasses::java_lang_Thread_vmData);
+ uintptr_t vmData = static_cast<uintptr_t>(vmData_field->GetInt(managed_thread));
+ Thread* thread = reinterpret_cast<Thread*>(vmData);
+ if (thread == NULL) {
+ return ThreadList::kInvalidId;
+ }
+ return thread->GetThinLockId();
+}
+
void Monitor::DescribeWait(std::ostream& os, const Thread* thread) {
ThreadState state = thread->GetState();
@@ -834,7 +853,7 @@
if (monitor != NULL) {
object = monitor->obj_;
}
- lock_owner = Thread::LockOwnerFromThreadLock(object);
+ lock_owner = LockOwnerFromThreadLock(object);
} else if (state == kBlocked) {
os << " - waiting to lock ";
object = thread->monitor_enter_object_;