From 16d1dd86dca33520b44d9802695e19d3b658af3e Mon Sep 17 00:00:00 2001 From: Chang Xing Date: Thu, 20 Jul 2017 17:56:26 -0700 Subject: Move transaction creation to runtime Move the transaction creation to runtime instead of passing a pointer to runtime when EnterTransactionMode. Because later there will be more places to create transaction so this makes the code cleaner and more compact. Test: make test-art-host -j64 Change-Id: I971edf3110eb6634b6e0f7f56256be04517a5281 --- compiler/driver/compiler_driver.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index cf04e41d5c..7970b4ca5d 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -2331,10 +2331,8 @@ class InitializeClassVisitor : public CompilationVisitor { // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity // checks in Thread::AssertThreadSuspensionIsAllowable. Runtime* const runtime = Runtime::Current(); - Transaction transaction; - // Run the class initializer in transaction mode. - runtime->EnterTransactionMode(&transaction); + runtime->EnterTransactionMode(); bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true, true); // TODO we detach transaction from runtime to indicate we quit the transactional @@ -2343,7 +2341,11 @@ class InitializeClassVisitor : public CompilationVisitor { { ScopedAssertNoThreadSuspension ants("Transaction end"); - runtime->ExitTransactionMode(); + + if (success) { + runtime->ExitTransactionMode(); + DCHECK(!runtime->IsActiveTransaction()); + } if (!success) { CHECK(soa.Self()->IsExceptionPending()); @@ -2357,7 +2359,7 @@ class InitializeClassVisitor : public CompilationVisitor { *file_log << exception->Dump() << "\n"; } soa.Self()->ClearException(); - transaction.Rollback(); + runtime->RollbackAndExitTransactionMode(); CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored"; } else if (is_boot_image) { // For boot image, we want to put the updated status in the oat class since we can't -- cgit v1.2.3-59-g8ed1b From cade5c3c75588da6d873df727acdaf3378a66efa Mon Sep 17 00:00:00 2001 From: Chang Xing Date: Thu, 20 Jul 2017 17:56:26 -0700 Subject: Track class initializing in transaction Add a field and a corresponding constructor to transaction which keeps track of the class that the transaction is initializing. To implement constraints for behaviors, the transaction needs to know which class it is initializing. Test: make test-art-host -j64 Change-Id: I87b3fcb3ef15914c79c6687ec8a87058265eaead --- compiler/driver/compiler_driver.cc | 2 +- runtime/runtime.cc | 5 +++++ runtime/runtime.h | 1 + runtime/transaction.cc | 5 +++++ runtime/transaction.h | 3 +++ 5 files changed, 15 insertions(+), 1 deletion(-) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 7970b4ca5d..dd58bc7d13 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -2332,7 +2332,7 @@ class InitializeClassVisitor : public CompilationVisitor { // checks in Thread::AssertThreadSuspensionIsAllowable. Runtime* const runtime = Runtime::Current(); // Run the class initializer in transaction mode. - runtime->EnterTransactionMode(); + runtime->EnterTransactionMode(klass.Get()); bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true, true); // TODO we detach transaction from runtime to indicate we quit the transactional diff --git a/runtime/runtime.cc b/runtime/runtime.cc index 01b87b932b..2366e10fae 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -2071,6 +2071,11 @@ void Runtime::EnterTransactionMode() { preinitialization_transaction_ = std::make_unique(); } +void Runtime::EnterTransactionMode(mirror::Class* root) { + DCHECK(IsAotCompiler()); + preinitialization_transaction_ = std::make_unique(root); +} + void Runtime::ExitTransactionMode() { DCHECK(IsAotCompiler()); preinitialization_transaction_ = nullptr; diff --git a/runtime/runtime.h b/runtime/runtime.h index 0200dc03bd..9424596c8a 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -459,6 +459,7 @@ class Runtime { return preinitialization_transaction_ != nullptr; } void EnterTransactionMode(); + void EnterTransactionMode(mirror::Class* root); void ExitTransactionMode(); // Transaction rollback and exit transaction are always done together, it's convenience to // do them in one function. diff --git a/runtime/transaction.cc b/runtime/transaction.cc index 907d37ef31..359030e6d6 100644 --- a/runtime/transaction.cc +++ b/runtime/transaction.cc @@ -38,6 +38,10 @@ Transaction::Transaction() CHECK(Runtime::Current()->IsAotCompiler()); } +Transaction::Transaction(mirror::Class* root) : Transaction() { + root_ = root; +} + Transaction::~Transaction() { if (kEnableTransactionStats) { MutexLock mu(Thread::Current(), log_lock_); @@ -270,6 +274,7 @@ void Transaction::UndoResolveStringModifications() { void Transaction::VisitRoots(RootVisitor* visitor) { MutexLock mu(Thread::Current(), log_lock_); + visitor->VisitRoot(reinterpret_cast(&root_), RootInfo(kRootUnknown)); VisitObjectLogs(visitor); VisitArrayLogs(visitor); VisitInternStringLogs(visitor); diff --git a/runtime/transaction.h b/runtime/transaction.h index 747c2d0f38..22518f6c7e 100644 --- a/runtime/transaction.h +++ b/runtime/transaction.h @@ -32,6 +32,7 @@ namespace art { namespace mirror { class Array; +class Class; class DexCache; class Object; class String; @@ -44,6 +45,7 @@ class Transaction FINAL { static constexpr const char* kAbortExceptionSignature = "Ldalvik/system/TransactionAbortError;"; Transaction(); + explicit Transaction(mirror::Class* root); ~Transaction(); void Abort(const std::string& abort_message) @@ -288,6 +290,7 @@ class Transaction FINAL { std::list resolve_string_logs_ GUARDED_BY(log_lock_); bool aborted_ GUARDED_BY(log_lock_); std::string abort_message_ GUARDED_BY(log_lock_); + mirror::Class* root_ GUARDED_BY(log_lock_); DISALLOW_COPY_AND_ASSIGN(Transaction); }; -- cgit v1.2.3-59-g8ed1b