| Index: src/heap/page-parallel-job.h
|
| diff --git a/src/heap/page-parallel-job.h b/src/heap/page-parallel-job.h
|
| index 0bb1ed27ad8bf859b2c8a86eebcf7c8209953c44..e78e0e2677a60d5bf3d2953c19a8bff575e4b7d4 100644
|
| --- a/src/heap/page-parallel-job.h
|
| +++ b/src/heap/page-parallel-job.h
|
| @@ -39,7 +39,8 @@ class PageParallelJob {
|
| items_(nullptr),
|
| num_items_(0),
|
| num_tasks_(0),
|
| - pending_tasks_(new base::Semaphore(0)) {}
|
| + pending_tasks_(new base::Semaphore(0)),
|
| + finished_tasks_(new base::AtomicNumber<int>(0)) {}
|
|
|
| ~PageParallelJob() {
|
| Item* item = items_;
|
| @@ -49,6 +50,7 @@ class PageParallelJob {
|
| item = next;
|
| }
|
| delete pending_tasks_;
|
| + delete finished_tasks_;
|
| }
|
|
|
| void AddPage(MemoryChunk* chunk, typename JobTraits::PerPageData data) {
|
| @@ -83,7 +85,7 @@ class PageParallelJob {
|
| start_index -= num_items_;
|
| }
|
| Task* task = new Task(heap_, items_, num_items_, start_index,
|
| - pending_tasks_, per_task_data_callback(i));
|
| + pending_tasks_, per_task_data_callback(i), this);
|
| task_ids[i] = task->id();
|
| if (i > 0) {
|
| V8::GetCurrentPlatform()->CallOnBackgroundThread(
|
| @@ -95,12 +97,18 @@ class PageParallelJob {
|
| // Contribute on main thread.
|
| main_task->Run();
|
| delete main_task;
|
| + int aborted_tasks = 0;
|
| // Wait for background tasks.
|
| for (int i = 0; i < num_tasks_; i++) {
|
| if (!cancelable_task_manager_->TryAbort(task_ids[i])) {
|
| pending_tasks_->Wait();
|
| + } else {
|
| + ++aborted_tasks;
|
| }
|
| }
|
| + int finished_tasks = finished_tasks_->Value();
|
| + // TODO(ulan): Remove this check after investigation of crbug.com/609249.
|
| + CHECK_EQ(aborted_tasks + finished_tasks, num_tasks_);
|
| if (JobTraits::NeedSequentialFinalization) {
|
| Item* item = items_;
|
| while (item != nullptr) {
|
| @@ -112,6 +120,8 @@ class PageParallelJob {
|
| }
|
| }
|
|
|
| + void NotifyFinishedTask() { finished_tasks_->Increment(1); }
|
| +
|
| private:
|
| static const int kMaxNumberOfTasks = 10;
|
|
|
| @@ -129,14 +139,16 @@ class PageParallelJob {
|
| class Task : public CancelableTask {
|
| public:
|
| Task(Heap* heap, Item* items, int num_items, int start_index,
|
| - base::Semaphore* on_finish, typename JobTraits::PerTaskData data)
|
| + base::Semaphore* on_finish, typename JobTraits::PerTaskData data,
|
| + PageParallelJob<JobTraits>* job)
|
| : CancelableTask(heap->isolate()),
|
| heap_(heap),
|
| items_(items),
|
| num_items_(num_items),
|
| start_index_(start_index),
|
| on_finish_(on_finish),
|
| - data_(data) {}
|
| + data_(data),
|
| + job_(job) {}
|
|
|
| virtual ~Task() {}
|
|
|
| @@ -161,6 +173,7 @@ class PageParallelJob {
|
| current = items_;
|
| }
|
| }
|
| + job_->NotifyFinishedTask();
|
| on_finish_->Signal("PageParallelJob::Task::RunInternal");
|
| }
|
|
|
| @@ -170,6 +183,7 @@ class PageParallelJob {
|
| int start_index_;
|
| base::Semaphore* on_finish_;
|
| typename JobTraits::PerTaskData data_;
|
| + PageParallelJob<JobTraits>* job_;
|
| DISALLOW_COPY_AND_ASSIGN(Task);
|
| };
|
|
|
| @@ -179,6 +193,7 @@ class PageParallelJob {
|
| int num_items_;
|
| int num_tasks_;
|
| base::Semaphore* pending_tasks_;
|
| + base::AtomicNumber<int>* finished_tasks_;
|
| DISALLOW_COPY_AND_ASSIGN(PageParallelJob);
|
| };
|
|
|
|
|