Implement "GetThreadGroupParent", "Suspend", and "Resume".

This is enough to get the GUI jswat working for poking around
threads, stacks, and locals.

Change-Id: Ib02d9666cee8d39c09e4a09cf3961cebff1768ac
diff --git a/src/thread_list.cc b/src/thread_list.cc
index 9a762ac..2179697 100644
--- a/src/thread_list.cc
+++ b/src/thread_list.cc
@@ -201,14 +201,14 @@
   }
 }
 
-void ThreadList::Suspend(Thread* thread) {
+void ThreadList::Suspend(Thread* thread, bool for_debugger) {
   DCHECK(thread != Thread::Current());
   thread_list_lock_.AssertHeld();
 
   // TODO: add another thread_suspend_lock_ to avoid GC/debugger races.
 
   if (verbose_) {
-    LOG(INFO) << "Suspend(" << *thread << ") starting...";
+    LOG(INFO) << "Suspend(" << *thread << ") starting..." << (for_debugger ? " (debugger)" : "");
   }
 
   if (!Contains(thread)) {
@@ -217,7 +217,7 @@
 
   {
     MutexLock mu(thread_suspend_count_lock_);
-    ModifySuspendCount(thread, +1, false);
+    ModifySuspendCount(thread, +1, for_debugger);
   }
 
   thread->WaitUntilSuspended();
@@ -309,12 +309,12 @@
   }
 }
 
-void ThreadList::Resume(Thread* thread) {
+void ThreadList::Resume(Thread* thread, bool for_debugger) {
   DCHECK(thread != Thread::Current());
   thread_list_lock_.AssertHeld();
 
   if (verbose_) {
-    LOG(INFO) << "Resume(" << *thread << ") starting...";
+    LOG(INFO) << "Resume(" << *thread << ") starting..." << (for_debugger ? " (debugger)" : "");
   }
 
   {
@@ -322,7 +322,7 @@
     if (!Contains(thread)) {
       return;
     }
-    ModifySuspendCount(thread, -1, false);
+    ModifySuspendCount(thread, -1, for_debugger);
   }
 
   {