diff options
author | Andreas Gampe <agampe@google.com> | 2015-10-08 19:39:36 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-10-08 19:39:36 +0000 |
commit | 2c072a91d693f2cacccf4f42ce7447e23fe562bd (patch) | |
tree | bb3d2fc3c140999a8d876ceda6154a2857ddaeeb | |
parent | 2930074ccac12dc6b742782c7f942d997dc66e5b (diff) | |
parent | 1c2f38b9795138b4afb6736003558a989e433b03 (diff) | |
download | android_art-2c072a91d693f2cacccf4f42ce7447e23fe562bd.tar.gz android_art-2c072a91d693f2cacccf4f42ce7447e23fe562bd.tar.bz2 android_art-2c072a91d693f2cacccf4f42ce7447e23fe562bd.zip |
am 1c2f38b9: am a13d2e11: Merge "ART: Do not abort on exception in CreatePeer" into mnc-dr-dev
* commit '1c2f38b9795138b4afb6736003558a989e433b03':
ART: Do not abort on exception in CreatePeer
-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(); } |