diff options
Diffstat (limited to 'src/barrier.cc')
| -rw-r--r-- | src/barrier.cc | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/barrier.cc b/src/barrier.cc new file mode 100644 index 0000000000..96518282bc --- /dev/null +++ b/src/barrier.cc @@ -0,0 +1,46 @@ +#include "barrier.h" +#include "../src/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"; +} + +} |