Add thread pool class

Added a thread pool class loosely based on google3 code.

Modified the compiler to have a single thread pool instead of creating new threads in ForAll.

Moved barrier to be in top level directory as it is not GC specific code.

Performance Timings:

Reference:
boot.oat: 14.306596s
time mm oat-target:
real    2m33.748s
user    10m23.190s
sys 5m54.140s

Thread pool:
boot.oat: 13.111049s
time mm oat-target:
real    2m29.372s
user    10m3.130s
sys 5m46.290s

The speed increase is probably just noise.

Change-Id: If3c1280cbaa4c7e4361127d064ac744ea12cdf49
diff --git a/src/gc/barrier.cc b/src/gc/barrier.cc
deleted file mode 100644
index aa9433b..0000000
--- a/src/gc/barrier.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "barrier.h"
-#include "../mutex.h"
-#include "thread.h"
-
-namespace art {
-
-Barrier::Barrier()
-    : count_(0),
-      lock_("GC barrier lock"),
-      condition_("GC barrier condition", lock_) {
-}
-
-void Barrier::Pass(Thread* self) {
-  MutexLock mu(self, lock_);
-  SetCountLocked(self, count_ - 1);
-}
-
-void Barrier::Wait(Thread* self) {
-  Increment(self, -1);
-}
-
-void Barrier::Init(Thread* self, int count) {
-  MutexLock mu(self, lock_);
-  SetCountLocked(self, count);
-}
-
-void Barrier::Increment(Thread* self, int delta) {
-  MutexLock mu(self, lock_);
-  SetCountLocked(self, count_ + delta);
-  if (count_ != 0) {
-    condition_.Wait(self);
-  }
-}
-
-void Barrier::SetCountLocked(Thread* self, int count) {
-  count_ = count;
-  if (count_ == 0) {
-    condition_.Broadcast(self);
-  }
-}
-
-Barrier::~Barrier() {
-  CHECK(!count_) << "Attempted to destory barrier with non zero count";
-}
-
-}
diff --git a/src/gc/barrier.h b/src/gc/barrier.h
deleted file mode 100644
index 207536a..0000000
--- a/src/gc/barrier.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ART_SRC_GC_BARRIER_H_
-#define ART_SRC_GC_BARRIER_H_
-
-#include "../mutex.h"
-#include "locks.h"
-#include "UniquePtr.h"
-
-namespace art {
-
-class Barrier {
- public:
-  Barrier();
-  virtual ~Barrier();
-
-  // Pass through the barrier, decrements the count but does not block.
-  void Pass(Thread* self);
-
-  // Wait on the barrier, decrement the count.
-  void Wait(Thread* self);
-
-  // Set the count to a new value, if the value is 0 then everyone waiting on the condition
-  // variable is resumed.
-  void Init(Thread* self, int count);
-
-  // Increment the count by delta, wait on condition if count is non zero.
-  void Increment(Thread* self, int delta);
-
- private:
-  void SetCountLocked(Thread* self, int count) EXCLUSIVE_LOCKS_REQUIRED(lock_);
-
-  // Counter, when this reaches 0 all people blocked on the barrier are signalled.
-  int count_ GUARDED_BY(lock_);
-
-  Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
-  ConditionVariable condition_ GUARDED_BY(lock_);
-};
-
-}  // namespace art
-#endif  // ART_SRC_GC_BARRIER_H_
-
diff --git a/src/gc/mark_sweep.cc b/src/gc/mark_sweep.cc
index 0869e26..e93eb1a 100644
--- a/src/gc/mark_sweep.cc
+++ b/src/gc/mark_sweep.cc
@@ -527,7 +527,7 @@
   Thread* self;
 };
 
-class CheckpointMarkThreadRoots : public Thread::CheckpointFunction {
+class CheckpointMarkThreadRoots : public Closure {
  public:
   CheckpointMarkThreadRoots(MarkSweep* mark_sweep) : mark_sweep_(mark_sweep) {
 
@@ -536,7 +536,8 @@
   virtual void Run(Thread* thread) NO_THREAD_SAFETY_ANALYSIS {
     // Note: self is not necessarily equal to thread since thread may be suspended.
     Thread* self = Thread::Current();
-    DCHECK(thread == self || thread->IsSuspended() || thread->GetState() == kWaitingPerformingGc);
+    DCHECK(thread == self || thread->IsSuspended() || thread->GetState() == kWaitingPerformingGc)
+        << thread->GetState();
     WriterMutexLock mu(self, *Locks::heap_bitmap_lock_);
     thread->VisitRoots(MarkSweep::MarkObjectVisitor, mark_sweep_);
     mark_sweep_->GetBarrier().Pass(self);