summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2015-03-03 13:39:30 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-03-03 13:39:31 +0000
commit775f1d4096efce112a3bd1e5897c84f898c5f7ce (patch)
tree44fbce76fdc2114947032cac69ad82aa93aee85c /runtime
parentcd93415651b7295d0bda1d37ef72ee99ba953c67 (diff)
parentbd9cf9f6bbf285ec7a5b74ce655a9e68e0f6e434 (diff)
downloadart-775f1d4096efce112a3bd1e5897c84f898c5f7ce.zip
art-775f1d4096efce112a3bd1e5897c84f898c5f7ce.tar.gz
art-775f1d4096efce112a3bd1e5897c84f898c5f7ce.tar.bz2
Merge "Follow-up 128393"
Diffstat (limited to 'runtime')
-rw-r--r--runtime/class_linker.cc4
-rw-r--r--runtime/runtime.cc8
-rw-r--r--runtime/transaction.cc6
-rw-r--r--runtime/transaction.h2
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_);