Add ScopedThreadSuspension

Fixes the TransitionFromRunnableToSuspended and
TransitionFromSuspendedToRunnable pattern that was prone to errors.

Change-Id: Ie6ae9c0357c83b4fc4899d05dfa0975553170267
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index ded70cd..9ee0a36 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -688,7 +688,7 @@
   const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
 
   // Go to native so that we don't block GC during compilation.
-  self->TransitionFromRunnableToSuspended(kNative);
+  ScopedThreadSuspension sts(self, kNative);
 
   std::vector<const DexFile*> dex_files;
   dex_files.push_back(dex_file);
@@ -718,7 +718,6 @@
                 dex_cache);
 
   self->GetJniEnv()->DeleteGlobalRef(jclass_loader);
-  self->TransitionFromSuspendedToRunnable();
 }
 
 CompiledMethod* CompilerDriver::CompileArtMethod(Thread* self, ArtMethod* method) {
@@ -737,7 +736,7 @@
       GetDexToDexCompilationLevel(self, *this, class_loader, *dex_file, class_def);
   const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
   // Go to native so that we don't block GC during compilation.
-  self->TransitionFromRunnableToSuspended(kNative);
+  ScopedThreadSuspension sts(self, kNative);
   CompileMethod(self,
                 this,
                 code_item,
@@ -751,7 +750,6 @@
                 true,
                 dex_cache);
   auto* compiled_method = GetCompiledMethod(MethodReference(dex_file, method_idx));
-  self->TransitionFromSuspendedToRunnable();
   return compiled_method;
 }
 
@@ -2382,7 +2380,7 @@
     }
 
     // Go to native so that we don't block GC during compilation.
-    soa.Self()->TransitionFromRunnableToSuspended(kNative);
+    ScopedThreadSuspension sts(soa.Self(), kNative);
 
     CompilerDriver* const driver = manager_->GetCompiler();
 
@@ -2437,8 +2435,6 @@
       it.Next();
     }
     DCHECK(!it.HasNext());
-
-    soa.Self()->TransitionFromSuspendedToRunnable();
   }
 
  private: