Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Side by Side Diff: src/heap/page-parallel-job.h

Issue 1806283002: Allocate semaphore of page parallel job on heap. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/mark-compact.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_HEAP_PAGE_PARALLEL_JOB_ 5 #ifndef V8_HEAP_PAGE_PARALLEL_JOB_
6 #define V8_HEAP_PAGE_PARALLEL_JOB_ 6 #define V8_HEAP_PAGE_PARALLEL_JOB_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/cancelable-task.h" 9 #include "src/cancelable-task.h"
10 #include "src/utils.h" 10 #include "src/utils.h"
(...skipping 20 matching lines...) Expand all
31 // MemoryChunk* page, 31 // MemoryChunk* page,
32 // PerPageData page_data) 32 // PerPageData page_data)
33 template <typename JobTraits> 33 template <typename JobTraits>
34 class PageParallelJob { 34 class PageParallelJob {
35 public: 35 public:
36 PageParallelJob(Heap* heap, CancelableTaskManager* cancelable_task_manager) 36 PageParallelJob(Heap* heap, CancelableTaskManager* cancelable_task_manager)
37 : heap_(heap), 37 : heap_(heap),
38 cancelable_task_manager_(cancelable_task_manager), 38 cancelable_task_manager_(cancelable_task_manager),
39 items_(nullptr), 39 items_(nullptr),
40 num_items_(0), 40 num_items_(0),
41 pending_tasks_(0) {} 41 num_tasks_(0),
42 pending_tasks_(new base::Semaphore(0)) {}
42 43
43 ~PageParallelJob() { 44 ~PageParallelJob() {
44 Item* item = items_; 45 Item* item = items_;
45 while (item != nullptr) { 46 while (item != nullptr) {
46 Item* next = item->next; 47 Item* next = item->next;
47 delete item; 48 delete item;
48 item = next; 49 item = next;
49 } 50 }
51 delete pending_tasks_;
50 } 52 }
51 53
52 void AddPage(MemoryChunk* chunk, typename JobTraits::PerPageData data) { 54 void AddPage(MemoryChunk* chunk, typename JobTraits::PerPageData data) {
53 Item* item = new Item(chunk, data, items_); 55 Item* item = new Item(chunk, data, items_);
54 items_ = item; 56 items_ = item;
55 ++num_items_; 57 ++num_items_;
56 } 58 }
57 59
58 int NumberOfPages() { return num_items_; } 60 int NumberOfPages() { return num_items_; }
59 61
(...skipping 14 matching lines...) Expand all
74 V8::GetCurrentPlatform()->NumberOfAvailableBackgroundThreads())); 76 V8::GetCurrentPlatform()->NumberOfAvailableBackgroundThreads()));
75 num_tasks_ = Max(1, Min(num_tasks, max_num_tasks)); 77 num_tasks_ = Max(1, Min(num_tasks, max_num_tasks));
76 int items_per_task = (num_items_ + num_tasks_ - 1) / num_tasks_; 78 int items_per_task = (num_items_ + num_tasks_ - 1) / num_tasks_;
77 int start_index = 0; 79 int start_index = 0;
78 Task* main_task = nullptr; 80 Task* main_task = nullptr;
79 for (int i = 0; i < num_tasks_; i++, start_index += items_per_task) { 81 for (int i = 0; i < num_tasks_; i++, start_index += items_per_task) {
80 if (start_index >= num_items_) { 82 if (start_index >= num_items_) {
81 start_index -= num_items_; 83 start_index -= num_items_;
82 } 84 }
83 Task* task = new Task(heap_, items_, num_items_, start_index, 85 Task* task = new Task(heap_, items_, num_items_, start_index,
84 &pending_tasks_, per_task_data_callback(i)); 86 pending_tasks_, per_task_data_callback(i));
85 task_ids[i] = task->id(); 87 task_ids[i] = task->id();
86 if (i > 0) { 88 if (i > 0) {
87 V8::GetCurrentPlatform()->CallOnBackgroundThread( 89 V8::GetCurrentPlatform()->CallOnBackgroundThread(
88 task, v8::Platform::kShortRunningTask); 90 task, v8::Platform::kShortRunningTask);
89 } else { 91 } else {
90 main_task = task; 92 main_task = task;
91 } 93 }
92 } 94 }
93 // Contribute on main thread. 95 // Contribute on main thread.
94 main_task->Run(); 96 main_task->Run();
95 delete main_task; 97 delete main_task;
96 // Wait for background tasks. 98 // Wait for background tasks.
97 for (int i = 0; i < num_tasks_; i++) { 99 for (int i = 0; i < num_tasks_; i++) {
98 if (!cancelable_task_manager_->TryAbort(task_ids[i])) { 100 if (!cancelable_task_manager_->TryAbort(task_ids[i])) {
99 pending_tasks_.Wait(); 101 pending_tasks_->Wait();
100 } 102 }
101 } 103 }
102 if (JobTraits::NeedSequentialFinalization) { 104 if (JobTraits::NeedSequentialFinalization) {
103 Item* item = items_; 105 Item* item = items_;
104 while (item != nullptr) { 106 while (item != nullptr) {
105 bool success = (item->state.Value() == kFinished); 107 bool success = (item->state.Value() == kFinished);
106 JobTraits::FinalizePageSequentially(heap_, item->chunk, success, 108 JobTraits::FinalizePageSequentially(heap_, item->chunk, success,
107 item->data); 109 item->data);
108 item = item->next; 110 item = item->next;
109 } 111 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 base::Semaphore* on_finish_; 171 base::Semaphore* on_finish_;
170 typename JobTraits::PerTaskData data_; 172 typename JobTraits::PerTaskData data_;
171 DISALLOW_COPY_AND_ASSIGN(Task); 173 DISALLOW_COPY_AND_ASSIGN(Task);
172 }; 174 };
173 175
174 Heap* heap_; 176 Heap* heap_;
175 CancelableTaskManager* cancelable_task_manager_; 177 CancelableTaskManager* cancelable_task_manager_;
176 Item* items_; 178 Item* items_;
177 int num_items_; 179 int num_items_;
178 int num_tasks_; 180 int num_tasks_;
179 base::Semaphore pending_tasks_; 181 base::Semaphore* pending_tasks_;
180 DISALLOW_COPY_AND_ASSIGN(PageParallelJob); 182 DISALLOW_COPY_AND_ASSIGN(PageParallelJob);
181 }; 183 };
182 184
183 } // namespace internal 185 } // namespace internal
184 } // namespace v8 186 } // namespace v8
185 187
186 #endif // V8_HEAP_PAGE_PARALLEL_JOB_ 188 #endif // V8_HEAP_PAGE_PARALLEL_JOB_
OLDNEW
« no previous file with comments | « src/heap/mark-compact.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698