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);