Commit 221dfcd3 authored by Omer Katz's avatar Omer Katz Committed by Commit Bot

heap: Remove worklist(int) ctor

This CL removes the option to initialize a worklist to less than
max_tasks. Having a static number of tasks allows replacing some
DCHECKs with static_asserts.

Bug: 986235
Change-Id: Ia14792bd946f8ef08606138b56617f90be9cc6ab
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2030970Reviewed-by: default avatarMichael Lippautz <mlippautz@chromium.org>
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737799}
parent 7402ccab
......@@ -748,7 +748,7 @@ void ThreadState::AtomicPauseMarkPrologue(
WriteBarrierWorklist* write_barrier_worklist =
Heap().GetWriteBarrierWorklist();
for (int concurrent_task = WorklistTaskId::ConcurrentThreadBase;
concurrent_task < marking_worklist->num_tasks(); ++concurrent_task) {
concurrent_task < MarkingWorklist::kNumTasks; ++concurrent_task) {
DCHECK(marking_worklist->IsLocalEmpty(concurrent_task));
DCHECK(write_barrier_worklist->IsLocalEmpty(concurrent_task));
}
......@@ -1183,10 +1183,13 @@ void ThreadState::IncrementalMarkingStart(BlinkGC::GCReason reason) {
const uint8_t max_concurrent_task_id =
WorklistTaskId::ConcurrentThreadBase +
kNumberOfConcurrentMarkingTasks;
DCHECK_EQ(Heap().GetMarkingWorklist()->num_tasks(),
Heap().GetWriteBarrierWorklist()->num_tasks());
DCHECK_LE(max_concurrent_task_id,
Heap().GetMarkingWorklist()->num_tasks());
static_assert(
MarkingWorklist::kNumTasks == WriteBarrierWorklist::kNumTasks,
"Marking worklist and write-barrier worklist should be the "
"same size");
static_assert(max_concurrent_task_id <= MarkingWorklist::kNumTasks,
"Number of concurrent marking tasks should not exceed "
"number of tasks in worlkist");
// Initialize concurrent marking task ids.
for (uint8_t i = WorklistTaskId::ConcurrentThreadBase;
i < max_concurrent_task_id; ++i) {
......
......@@ -31,14 +31,16 @@ namespace blink {
//
// Work stealing is best effort, i.e., there is no way to inform other tasks
// of the need of items.
template <typename _EntryType, int segment_size, int max_tasks = 2>
template <typename _EntryType, int segment_size, int num_tasks = 2>
class Worklist {
USING_FAST_MALLOC(Worklist);
using WorklistType = Worklist<_EntryType, segment_size, max_tasks>;
using WorklistType = Worklist<_EntryType, segment_size, num_tasks>;
public:
using EntryType = _EntryType;
static constexpr int kNumTasks = num_tasks;
class View {
DISALLOW_NEW();
......@@ -80,11 +82,8 @@ class Worklist {
static constexpr size_t kSegmentCapacity = segment_size;
Worklist() : Worklist(max_tasks) {}
explicit Worklist(int num_tasks) : num_tasks_(num_tasks) {
CHECK_LE(num_tasks, max_tasks);
for (int i = 0; i < num_tasks_; i++) {
Worklist() {
for (int i = 0; i < kNumTasks; i++) {
private_push_segment(i) = NewSegment();
private_pop_segment(i) = NewSegment();
}
......@@ -92,7 +91,7 @@ class Worklist {
~Worklist() {
CHECK(IsGlobalEmpty());
for (int i = 0; i < num_tasks_; i++) {
for (int i = 0; i < kNumTasks; i++) {
DCHECK(private_push_segment(i));
DCHECK(private_pop_segment(i));
delete private_push_segment(i);
......@@ -101,7 +100,7 @@ class Worklist {
}
bool Push(int task_id, EntryType entry) {
DCHECK_LT(task_id, num_tasks_);
DCHECK_LT(task_id, kNumTasks);
DCHECK(private_push_segment(task_id));
if (!private_push_segment(task_id)->Push(entry)) {
PublishPushSegmentToGlobal(task_id);
......@@ -113,7 +112,7 @@ class Worklist {
}
bool Pop(int task_id, EntryType* entry) {
DCHECK_LT(task_id, num_tasks_);
DCHECK_LT(task_id, kNumTasks);
DCHECK(private_pop_segment(task_id));
if (!private_pop_segment(task_id)->Pop(entry)) {
if (!private_push_segment(task_id)->IsEmpty()) {
......@@ -138,7 +137,7 @@ class Worklist {
bool IsGlobalPoolEmpty() const { return global_pool_.IsEmpty(); }
bool IsGlobalEmpty() const {
for (int i = 0; i < num_tasks_; i++) {
for (int i = 0; i < kNumTasks; i++) {
if (!IsLocalEmpty(i))
return false;
}
......@@ -165,7 +164,7 @@ class Worklist {
//
// Assumes that no other tasks are running.
void Clear() {
for (int i = 0; i < num_tasks_; i++) {
for (int i = 0; i < kNumTasks; i++) {
private_pop_segment(i)->Clear();
private_push_segment(i)->Clear();
}
......@@ -182,7 +181,7 @@ class Worklist {
// Assumes that no other tasks are running.
template <typename Callback>
void Update(Callback callback) {
for (int i = 0; i < num_tasks_; i++) {
for (int i = 0; i < kNumTasks; i++) {
private_pop_segment(i)->Update(callback);
private_push_segment(i)->Update(callback);
}
......@@ -203,8 +202,6 @@ class Worklist {
global_pool_.Merge(&other->global_pool_);
}
int num_tasks() const { return num_tasks_; }
private:
FRIEND_TEST_ALL_PREFIXES(WorklistTest, SegmentCreate);
FRIEND_TEST_ALL_PREFIXES(WorklistTest, SegmentPush);
......@@ -447,9 +444,8 @@ class Worklist {
return new Segment();
}
PrivateSegmentHolder private_segments_[max_tasks];
PrivateSegmentHolder private_segments_[kNumTasks];
GlobalPool global_pool_;
int num_tasks_;
};
} // namespace blink
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment