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();