More threads work.

Adds stubs (and sometimes implementations) for dalvik.system.VMStack and
java.lang.Thread native methods. There was a bug in the dalvik
thread priority setting code, where the current thread and the passed-in
thread were confused.

I've also pulled Mutex and ThreadList out into their own files, and
moved some functionality around (with the aim of having more stuff
private, especially locks).

Change-Id: Ieb0f22669cac3df44ca34f7868f8e7d4dfa09ab6
diff --git a/src/runtime.cc b/src/runtime.cc
index 9517bc2..454a38c 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -14,6 +14,7 @@
 #include "jni_internal.h"
 #include "signal_catcher.h"
 #include "thread.h"
+#include "thread_list.h"
 
 // TODO: this drags in cutil/log.h, which conflicts with our logging.h.
 #include "JniConstants.h"
@@ -363,7 +364,7 @@
   abort_ = options->hook_abort_;
 
   default_stack_size_ = options->stack_size_;
-  thread_list_ = ThreadList::Create();
+  thread_list_ = new ThreadList;
 
   intern_table_ = new InternTable;
 
@@ -407,18 +408,17 @@
 
 void Runtime::RegisterRuntimeNativeMethods(JNIEnv* env) {
 #define REGISTER(FN) extern void FN(JNIEnv*); FN(env)
-  //REGISTER(register_dalvik_bytecode_OpcodeInfo);
   //REGISTER(register_dalvik_system_DexFile);
   //REGISTER(register_dalvik_system_VMDebug);
   //REGISTER(register_dalvik_system_VMRuntime);
-  //REGISTER(register_dalvik_system_VMStack);
+  REGISTER(register_dalvik_system_VMStack);
   //REGISTER(register_dalvik_system_Zygote);
   //REGISTER(register_java_lang_Class);
   REGISTER(register_java_lang_Object);
   REGISTER(register_java_lang_Runtime);
   REGISTER(register_java_lang_String);
   REGISTER(register_java_lang_System);
-  //REGISTER(register_java_lang_Thread);
+  REGISTER(register_java_lang_Thread);
   REGISTER(register_java_lang_Throwable);
   //REGISTER(register_java_lang_VMClassLoader);
   //REGISTER(register_java_lang_reflect_AccessibleObject);
@@ -434,7 +434,7 @@
 #undef REGISTER
 }
 
-void Runtime::DumpStatistics(std::ostream& os) {
+void Runtime::Dump(std::ostream& os) {
   // TODO: dump other runtime statistics?
   os << "Loaded classes: " << class_linker_->NumLoadedClasses() << "\n";
   os << "Intern table size: " << GetInternTable()->Size() << "\n";
@@ -445,6 +445,8 @@
   //    gDvm.pBootLoaderAlloc->curOffset);
   // LOGI("GC precise methods: %d", dvmPointerSetGetCount(gDvm.preciseMethods));
   os << "\n";
+
+  thread_list_->Dump(os);
 }
 
 void Runtime::BlockSignals() {