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/jni_internal.cc b/src/jni_internal.cc
index c60dc24..83a147f 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -452,16 +452,12 @@
   SharedLibrary(const std::string& path, void* handle, Object* class_loader)
       : path_(path),
         handle_(handle),
-        jni_on_load_lock_(Mutex::Create("JNI_OnLoad lock")),
+        jni_on_load_lock_("JNI_OnLoad lock"),
         jni_on_load_thread_id_(Thread::Current()->GetThinLockId()),
         jni_on_load_result_(kPending) {
     pthread_cond_init(&jni_on_load_cond_, NULL);
   }
 
-  ~SharedLibrary() {
-    delete jni_on_load_lock_;
-  }
-
   Object* GetClassLoader() {
     return class_loader_;
   }
@@ -491,7 +487,7 @@
                   << "JNI_OnLoad...]";
       }
       ScopedThreadStateChange tsc(self, Thread::kWaiting); // TODO: VMWAIT
-      pthread_cond_wait(&jni_on_load_cond_, jni_on_load_lock_->GetImpl());
+      pthread_cond_wait(&jni_on_load_cond_, jni_on_load_lock_.GetImpl());
     }
 
     bool okay = (jni_on_load_result_ == kOkay);
@@ -532,7 +528,7 @@
   Object* class_loader_;
 
   // Guards remaining items.
-  Mutex* jni_on_load_lock_;
+  Mutex jni_on_load_lock_;
   // Wait for JNI_OnLoad in other thread.
   pthread_cond_t jni_on_load_cond_;
   // Recursive invocation guard.
@@ -2654,13 +2650,13 @@
       log_third_party_jni(options->IsVerbose("third-party-jni")),
       trace(options->jni_trace_),
       work_around_app_jni_bugs(false), // TODO: add a way to enable this
-      pins_lock(Mutex::Create("JNI pin table lock")),
+      pins_lock("JNI pin table lock"),
       pin_table("pin table", kPinTableInitialSize, kPinTableMaxSize),
-      globals_lock(Mutex::Create("JNI global reference table lock")),
+      globals_lock("JNI global reference table lock"),
       globals(kGlobalsInitial, kGlobalsMax, kGlobal),
-      weak_globals_lock(Mutex::Create("JNI weak global reference table lock")),
+      weak_globals_lock("JNI weak global reference table lock"),
       weak_globals(kWeakGlobalsInitial, kWeakGlobalsMax, kWeakGlobal),
-      libraries_lock(Mutex::Create("JNI shared libraries map lock")),
+      libraries_lock("JNI shared libraries map lock"),
       libraries(new Libraries) {
   functions = unchecked_functions = &gInvokeInterface;
   if (check_jni) {
@@ -2669,10 +2665,6 @@
 }
 
 JavaVMExt::~JavaVMExt() {
-  delete pins_lock;
-  delete globals_lock;
-  delete weak_globals_lock;
-  delete libraries_lock;
   delete libraries;
 }