diff options
author | Andreas Gampe <agampe@google.com> | 2015-10-08 18:11:58 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-10-08 18:11:58 +0000 |
commit | a13d2e118700975d2cda73ffff85546a387308db (patch) | |
tree | c25396fb5f61b14e25406594bb538b6c17cbf1e0 | |
parent | 39795fc590d835bfb95ed5a5bb8ac488dfd1b82c (diff) | |
parent | 2a196784553f4fd0c0f7d4b8aac87281db3a4748 (diff) | |
download | art-a13d2e118700975d2cda73ffff85546a387308db.tar.gz |
Merge "ART: Do not abort on exception in CreatePeer" into mnc-dr-dev
-rw-r--r-- | runtime/thread.cc | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/runtime/thread.cc b/runtime/thread.cc index 5274f9e0d3..6e8f89cb49 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -546,6 +546,18 @@ Thread* Thread::Attach(const char* thread_name, bool as_daemon, jobject thread_g // a native peer! if (create_peer) { self->CreatePeer(thread_name, as_daemon, thread_group); + if (self->IsExceptionPending()) { + // We cannot keep the exception around, as we're deleting self. Try to be helpful and log it. + { + ScopedObjectAccess soa(self); + LOG(ERROR) << "Exception creating thread peer:"; + LOG(ERROR) << self->GetException()->Dump(); + self->ClearException(); + } + runtime->GetThreadList()->Unregister(self); + // Unregister deletes self, no need to do this here. + return nullptr; + } } else { // These aren't necessary, but they improve diagnostics for unit tests & command-line tools. if (thread_name != nullptr) { @@ -594,7 +606,9 @@ void Thread::CreatePeer(const char* name, bool as_daemon, jobject thread_group) WellKnownClasses::java_lang_Thread, WellKnownClasses::java_lang_Thread_init, thread_group, thread_name.get(), thread_priority, thread_is_daemon); - AssertNoPendingException(); + if (IsExceptionPending()) { + return; + } Thread* self = this; DCHECK_EQ(self, Thread::Current()); @@ -1256,6 +1270,7 @@ void Thread::FinishStartup() { // Finish attaching the main thread. ScopedObjectAccess soa(Thread::Current()); Thread::Current()->CreatePeer("main", false, runtime->GetMainThreadGroup()); + Thread::Current()->AssertNoPendingException(); Runtime::Current()->GetClassLinker()->RunRootClinits(); } |