summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Gampe <agampe@google.com>2015-10-08 19:39:36 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-10-08 19:39:36 +0000
commit2c072a91d693f2cacccf4f42ce7447e23fe562bd (patch)
treebb3d2fc3c140999a8d876ceda6154a2857ddaeeb
parent2930074ccac12dc6b742782c7f942d997dc66e5b (diff)
parent1c2f38b9795138b4afb6736003558a989e433b03 (diff)
downloadandroid_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.cc17
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();
}