blob: 96518282bcfd856f122c66764b118ed5e5a96ae0 [file] [log] [blame]
#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";
}
}