Add a -verbose:thread option.

Change-Id: Ie9bbe2195d7c427379e4a27d3fe51f1a71e58597
diff --git a/src/runtime.cc b/src/runtime.cc
index 424b6f7..acb42e9 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -405,7 +405,7 @@
 
   default_stack_size_ = options->stack_size_;
 
-  thread_list_ = new ThreadList;
+  thread_list_ = new ThreadList(options->IsVerbose("thread"));
   intern_table_ = new InternTable;
 
   Heap::Init(options->heap_initial_size_, options->heap_maximum_size_,
diff --git a/src/thread.cc b/src/thread.cc
index 49200c2..fb2ba8d 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -627,7 +627,6 @@
 }
 
 Thread* Thread::Attach(const Runtime* runtime, const char* name, bool as_daemon) {
-  LOG(INFO) << "Thread::Attach '" << name << "'";
   Thread* self = new Thread;
   self->Attach(runtime);
 
diff --git a/src/thread_list.cc b/src/thread_list.cc
index f49c49d..7b6d3ba 100644
--- a/src/thread_list.cc
+++ b/src/thread_list.cc
@@ -20,8 +20,9 @@
 
 namespace art {
 
-ThreadList::ThreadList()
-    : thread_list_lock_("thread list lock"),
+ThreadList::ThreadList(bool verbose)
+    : verbose_(verbose),
+      thread_list_lock_("thread list lock"),
       thread_start_cond_("thread_start_cond_"),
       thread_exit_cond_("thread_exit_cond_"),
       thread_suspend_count_lock_("thread suspend count lock"),
@@ -60,7 +61,9 @@
     return;
   }
 
-  //LOG(INFO) << *thread << " self-suspending";
+  if (verbose_) {
+    LOG(INFO) << *thread << " self-suspending";
+  }
   {
     ScopedThreadStateChange tsc(thread, Thread::kSuspended);
     while (thread->suspend_count_ != 0) {
@@ -73,7 +76,9 @@
     }
     CHECK_EQ(thread->suspend_count_, 0);
   }
-  //LOG(INFO) << *thread << " self-reviving";
+  if (verbose_) {
+    LOG(INFO) << *thread << " self-reviving";
+  }
 }
 
 void ThreadList::SuspendAll() {
@@ -81,7 +86,9 @@
 
   // TODO: add another thread_suspend_lock_ to avoid GC/debugger races.
 
-  //LOG(INFO) << *self << " SuspendAll starting...";
+  if (verbose_) {
+    LOG(INFO) << *self << " SuspendAll starting...";
+  }
 
   MutexLock mu(thread_list_lock_);
 
@@ -91,7 +98,9 @@
     for (It it = list_.begin(), end = list_.end(); it != end; ++it) {
       Thread* thread = *it;
       if (thread != self) {
-        //LOG(INFO) << "requesting thread suspend: " << *thread;
+        if (verbose_) {
+          LOG(INFO) << "requesting thread suspend: " << *thread;
+        }
         ++thread->suspend_count_;
       }
     }
@@ -115,11 +124,15 @@
     Thread* thread = *it;
     if (thread != self) {
       thread->WaitUntilSuspended();
-      //LOG(INFO) << "thread suspended: " << *thread;
+      if (verbose_) {
+        LOG(INFO) << "thread suspended: " << *thread;
+      }
     }
   }
 
-  //LOG(INFO) << *self << " SuspendAll complete";
+  if (verbose_) {
+    LOG(INFO) << *self << " SuspendAll complete";
+  }
 }
 
 void ThreadList::Suspend(Thread* thread) {
@@ -127,7 +140,9 @@
 
   // TODO: add another thread_suspend_lock_ to avoid GC/debugger races.
 
-  //LOG(INFO) << "Suspend(" << *thread << ") starting...";
+  if (verbose_) {
+    LOG(INFO) << "Suspend(" << *thread << ") starting...";
+  }
 
   MutexLock mu(thread_list_lock_);
   if (!Contains(thread)) {
@@ -141,14 +156,18 @@
 
   thread->WaitUntilSuspended();
 
-  //LOG(INFO) << "Suspend(" << *thread << ") complete";
+  if (verbose_) {
+    LOG(INFO) << "Suspend(" << *thread << ") complete";
+  }
 }
 
 
 void ThreadList::ResumeAll() {
   Thread* self = Thread::Current();
 
-  //LOG(INFO) << *self << " ResumeAll starting";
+  if (verbose_) {
+    LOG(INFO) << *self << " ResumeAll starting";
+  }
 
   // Decrement the suspend counts for all threads.  No need for atomic
   // writes, since nobody should be moving until we decrement the count.
@@ -171,18 +190,24 @@
   // Broadcast a notification to all suspended threads, some or all of
   // which may choose to wake up.  No need to wait for them.
   {
-    //LOG(INFO) << *self << " ResumeAll waking others";
+    if (verbose_) {
+      LOG(INFO) << *self << " ResumeAll waking others";
+    }
     MutexLock mu(thread_suspend_count_lock_);
     thread_suspend_count_cond_.Broadcast();
   }
 
-  //LOG(INFO) << *self << " ResumeAll complete";
+  if (verbose_) {
+    LOG(INFO) << *self << " ResumeAll complete";
+  }
 }
 
 void ThreadList::Resume(Thread* thread) {
   DCHECK(thread != Thread::Current());
 
-  //LOG(INFO) << "Resume(" << *thread << ") starting...";
+  if (verbose_) {
+    LOG(INFO) << "Resume(" << *thread << ") starting...";
+  }
 
   {
     MutexLock mu1(thread_list_lock_);
@@ -198,12 +223,16 @@
   }
 
   {
-    //LOG(INFO) << "Resume(" << *thread << ") waking others";
+    if (verbose_) {
+      LOG(INFO) << "Resume(" << *thread << ") waking others";
+    }
     MutexLock mu(thread_suspend_count_lock_);
     thread_suspend_count_cond_.Broadcast();
   }
 
-  //LOG(INFO) << "Resume(" << *thread << ") complete";
+  if (verbose_) {
+    LOG(INFO) << "Resume(" << *thread << ") complete";
+  }
 }
 
 void ThreadList::RunWhileSuspended(Thread* thread, void (*callback)(void*), void* arg) {
@@ -221,8 +250,10 @@
 void ThreadList::Register() {
   Thread* self = Thread::Current();
 
-  //LOG(INFO) << "ThreadList::Register() " << *self;
-  self->Dump(std::cerr);
+  if (verbose_) {
+    LOG(INFO) << "ThreadList::Register() " << *self;
+    self->Dump(std::cerr);
+  }
 
   MutexLock mu(thread_list_lock_);
   CHECK(!Contains(self));
@@ -232,7 +263,10 @@
 void ThreadList::Unregister() {
   Thread* self = Thread::Current();
 
-  //LOG(INFO) << "ThreadList::Unregister() " << *self;
+  if (verbose_) {
+    LOG(INFO) << "ThreadList::Unregister() " << *self;
+  }
+
   MutexLock mu(thread_list_lock_);
 
   // Remove this thread from the list.
diff --git a/src/thread_list.h b/src/thread_list.h
index e83b043..e5d9eab 100644
--- a/src/thread_list.h
+++ b/src/thread_list.h
@@ -28,7 +28,7 @@
   static const uint32_t kInvalidId = 0;
   static const uint32_t kMainId = 1;
 
-  ThreadList();
+  ThreadList(bool verbose);
   ~ThreadList();
 
   void Dump(std::ostream& os);
@@ -60,6 +60,8 @@
   void SuspendAllDaemonThreads();
   void WaitForNonDaemonThreadsToExit();
 
+  bool verbose_;
+
   mutable Mutex thread_list_lock_;
   std::bitset<kMaxThreadId> allocated_ids_;
   std::list<Thread*> list_;