blob: 96518282bcfd856f122c66764b118ed5e5a96ae0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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";
}
}
|