diff options
author | Sebastien Hertz <shertz@google.com> | 2015-04-28 12:31:41 +0200 |
---|---|---|
committer | Sebastien Hertz <shertz@google.com> | 2015-04-29 15:50:03 +0200 |
commit | b81e1cddd6a8ccccb9fe86e3bfae12b2657b8085 (patch) | |
tree | d247ef138c2304c2ac7c5a0147ad06200e58de07 | |
parent | b6829c2ee05124d64a19c7a52ada4a23f624fb91 (diff) | |
download | art-b81e1cddd6a8ccccb9fe86e3bfae12b2657b8085.zip art-b81e1cddd6a8ccccb9fe86e3bfae12b2657b8085.tar.gz art-b81e1cddd6a8ccccb9fe86e3bfae12b2657b8085.tar.bz2 |
Fix missing transaction abort error message
Change-Id: I5157def06d385c082f9fdd4714e20bead9e707e8
-rw-r--r-- | runtime/runtime.cc | 5 | ||||
-rw-r--r-- | runtime/transaction.cc | 14 | ||||
-rw-r--r-- | runtime/transaction.h | 2 |
3 files changed, 15 insertions, 6 deletions
diff --git a/runtime/runtime.cc b/runtime/runtime.cc index eb60318..2633898 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -1566,14 +1566,15 @@ void Runtime::AbortTransactionAndThrowAbortError(Thread* self, const std::string // 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_->ThrowAbortError(self, false); + preinitialization_transaction_->ThrowAbortError(self, &abort_message); preinitialization_transaction_->Abort(abort_message); } void Runtime::ThrowTransactionAbortError(Thread* self) { DCHECK(IsAotCompiler()); DCHECK(IsActiveTransaction()); - preinitialization_transaction_->ThrowAbortError(self, true); + // Passing nullptr means we rethrow an exception with the earlier transaction abort message. + preinitialization_transaction_->ThrowAbortError(self, nullptr); } void Runtime::RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, diff --git a/runtime/transaction.cc b/runtime/transaction.cc index cc0f15f..ab821d7 100644 --- a/runtime/transaction.cc +++ b/runtime/transaction.cc @@ -70,13 +70,21 @@ void Transaction::Abort(const std::string& abort_message) { } } -void Transaction::ThrowAbortError(Thread* self, bool rethrow) { +void Transaction::ThrowAbortError(Thread* self, const std::string* abort_message) { + const bool rethrow = (abort_message == nullptr); if (kIsDebugBuild && rethrow) { CHECK(IsAborted()) << "Rethrow " << Transaction::kAbortExceptionDescriptor << " while transaction is not aborted"; } - std::string abort_msg(GetAbortMessage()); - self->ThrowNewWrappedException(Transaction::kAbortExceptionSignature, abort_msg.c_str()); + if (rethrow) { + // Rethrow an exception with the earlier abort message stored in the transaction. + self->ThrowNewWrappedException(Transaction::kAbortExceptionSignature, + GetAbortMessage().c_str()); + } else { + // Throw an exception with the given abort message. + self->ThrowNewWrappedException(Transaction::kAbortExceptionSignature, + abort_message->c_str()); + } } bool Transaction::IsAborted() { diff --git a/runtime/transaction.h b/runtime/transaction.h index 4d85662..030478c 100644 --- a/runtime/transaction.h +++ b/runtime/transaction.h @@ -48,7 +48,7 @@ class Transaction FINAL { void Abort(const std::string& abort_message) LOCKS_EXCLUDED(log_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void ThrowAbortError(Thread* self, bool rethrow) + void ThrowAbortError(Thread* self, const std::string* abort_message) LOCKS_EXCLUDED(log_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsAborted() LOCKS_EXCLUDED(log_lock_); |