Fail threads attaching during runtime shutdown.

Introduce counters to indicate that threads are being born. Don't allow
thread birth to occur during runtime shutdown.

Bug: 7000936

Change-Id: Ib0d78f78c0ff126a4b5d3b5a6f1a2ff8f5061ae9
diff --git a/src/thread.h b/src/thread.h
index 68172e5..1e80a80 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -49,6 +49,7 @@
 class Context;
 struct DebugInvokeReq;
 class DexFile;
+struct JavaVMExt;
 struct JNIEnvExt;
 class Monitor;
 class Object;
@@ -284,9 +285,6 @@
     return peer_ != NULL;
   }
 
-  Object* GetThreadGroup(const ScopedObjectAccessUnchecked& ts) const
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
-
   RuntimeStats* GetStats() {
     return &stats_;
   }
@@ -359,8 +357,7 @@
 
   // OutOfMemoryError is special, because we need to pre-allocate an instance.
   // Only the GC should call this.
-  void ThrowOutOfMemoryError(const char* msg)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
+  void ThrowOutOfMemoryError(const char* msg) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
 
   //QuickFrameIterator FindExceptionHandler(void* throw_pc, void** handler_pc);
 
@@ -456,6 +453,10 @@
     stack_end_ = stack_begin_ + kStackOverflowReservedBytes;
   }
 
+  bool IsHandlingStackOverflow() const {
+    return stack_end_ == stack_begin_;
+  }
+
   static ThreadOffset StackEndOffset() {
     return ThreadOffset(OFFSETOF_MEMBER(Thread, stack_end_));
   }
@@ -590,12 +591,10 @@
 
   static void* CreateCallback(void* arg);
 
-  void HandleUncaughtExceptions(const ScopedObjectAccess& soa)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
-  void RemoveFromThreadGroup(const ScopedObjectAccess& soa)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
+  void HandleUncaughtExceptions();
+  void RemoveFromThreadGroup();
 
-  void Init();
+  void Init(ThreadList*, JavaVMExt*) EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_);
   void InitCardTable();
   void InitCpu();
   void InitFunctionPointers();