diff options
author | Sebastien Hertz <shertz@google.com> | 2015-03-03 13:39:30 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-03-03 13:39:31 +0000 |
commit | 775f1d4096efce112a3bd1e5897c84f898c5f7ce (patch) | |
tree | 44fbce76fdc2114947032cac69ad82aa93aee85c /runtime | |
parent | cd93415651b7295d0bda1d37ef72ee99ba953c67 (diff) | |
parent | bd9cf9f6bbf285ec7a5b74ce655a9e68e0f6e434 (diff) | |
download | art-775f1d4096efce112a3bd1e5897c84f898c5f7ce.zip art-775f1d4096efce112a3bd1e5897c84f898c5f7ce.tar.gz art-775f1d4096efce112a3bd1e5897c84f898c5f7ce.tar.bz2 |
Merge "Follow-up 128393"
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/class_linker.cc | 4 | ||||
-rw-r--r-- | runtime/runtime.cc | 8 | ||||
-rw-r--r-- | runtime/transaction.cc | 6 | ||||
-rw-r--r-- | runtime/transaction.h | 2 |
4 files changed, 12 insertions, 8 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 03c5a11..2989b8c 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -4241,8 +4241,8 @@ bool ClassLinker::InitializeClass(Thread* self, Handle<mirror::Class> klass, } else if (Runtime::Current()->IsTransactionAborted()) { // The exception thrown when the transaction aborted has been caught and cleared // so we need to throw it again now. - LOG(WARNING) << "Return from class initializer of " << PrettyDescriptor(klass.Get()) - << " without exception while transaction was aborted: re-throw it now."; + VLOG(compiler) << "Return from class initializer of " << PrettyDescriptor(klass.Get()) + << " without exception while transaction was aborted: re-throw it now."; Runtime::Current()->ThrowInternalErrorForAbortedTransaction(self); klass->SetStatus(mirror::Class::kStatusError, self); success = false; diff --git a/runtime/runtime.cc b/runtime/runtime.cc index edc55c8..383308c 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -1560,15 +1560,17 @@ void Runtime::AbortTransactionAndThrowInternalError(Thread* self, const std::string& abort_message) { DCHECK(IsCompiler()); DCHECK(IsActiveTransaction()); + // Throwing an exception may cause its class initialization. If we mark the transaction + // aborted before that, we may warn with a false alarm. Throwing the exception before + // marking the transaction aborted avoids that. + preinitialization_transaction_->ThrowInternalError(self, false); preinitialization_transaction_->Abort(abort_message); - ThrowInternalErrorForAbortedTransaction(self); } void Runtime::ThrowInternalErrorForAbortedTransaction(Thread* self) { DCHECK(IsCompiler()); DCHECK(IsActiveTransaction()); - DCHECK(IsTransactionAborted()); - preinitialization_transaction_->ThrowInternalError(self); + preinitialization_transaction_->ThrowInternalError(self, true); } void Runtime::RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, diff --git a/runtime/transaction.cc b/runtime/transaction.cc index e26f955..c0fd7a5 100644 --- a/runtime/transaction.cc +++ b/runtime/transaction.cc @@ -70,8 +70,10 @@ void Transaction::Abort(const std::string& abort_message) { } } -void Transaction::ThrowInternalError(Thread* self) { - DCHECK(IsAborted()); +void Transaction::ThrowInternalError(Thread* self, bool rethrow) { + if (kIsDebugBuild && rethrow) { + CHECK(IsAborted()) << "Rethrow InternalError while transaction is not aborted"; + } std::string abort_msg(GetAbortMessage()); self->ThrowNewException(self->GetCurrentLocationForThrow(), "Ljava/lang/InternalError;", abort_msg.c_str()); diff --git a/runtime/transaction.h b/runtime/transaction.h index be614f9..e1b93c9 100644 --- a/runtime/transaction.h +++ b/runtime/transaction.h @@ -45,7 +45,7 @@ class Transaction FINAL { void Abort(const std::string& abort_message) LOCKS_EXCLUDED(log_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void ThrowInternalError(Thread* self) + void ThrowInternalError(Thread* self, bool rethrow) LOCKS_EXCLUDED(log_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsAborted() LOCKS_EXCLUDED(log_lock_); |