diff options
author | Matt Loring <mattloring@google.com> | 2017-08-03 07:05:36 -0700 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-08-17 20:26:17 +0200 |
commit | 354a17b0c090f88e29936b3a72dfed673cc68c4d (patch) | |
tree | 323a3f88ebb412b1690dc1bd84ff1c2813062f69 /deps | |
parent | 4fbedbbfc3e4aef0f573026532a9d622ea5825c2 (diff) | |
download | android-node-v8-354a17b0c090f88e29936b3a72dfed673cc68c4d.tar.gz android-node-v8-354a17b0c090f88e29936b3a72dfed673cc68c4d.tar.bz2 android-node-v8-354a17b0c090f88e29936b3a72dfed673cc68c4d.zip |
deps: backport 6e9e2e5 from upstream V8
Original commit message:
[heap] Move SweeperTask to CancelableTask
This mitigates the problem of blocking on the main thread when the
platform is unable to execute background tasks in a timely manner.
Bug: v8:6655
Change-Id: Icdaae744ee73146b86b9a28c8035138746721971
Reviewed-on: https://chromium-review.googlesource.com/595467
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47036}
PR-URL: https://github.com/nodejs/node/pull/14001
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Diffstat (limited to 'deps')
-rw-r--r-- | deps/v8/src/heap/mark-compact.cc | 40 | ||||
-rw-r--r-- | deps/v8/src/heap/mark-compact.h | 13 |
2 files changed, 32 insertions, 21 deletions
diff --git a/deps/v8/src/heap/mark-compact.cc b/deps/v8/src/heap/mark-compact.cc index 6bb7d3e352..d970e1a50e 100644 --- a/deps/v8/src/heap/mark-compact.cc +++ b/deps/v8/src/heap/mark-compact.cc @@ -7,6 +7,7 @@ #include "src/base/atomicops.h" #include "src/base/bits.h" #include "src/base/sys-info.h" +#include "src/cancelable-task.h" #include "src/code-stubs.h" #include "src/compilation-cache.h" #include "src/deoptimizer.h" @@ -546,12 +547,14 @@ void MarkCompactCollector::ClearMarkbits() { heap_->lo_space()->ClearMarkingStateOfLiveObjects(); } -class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task { +class MarkCompactCollector::Sweeper::SweeperTask final : public CancelableTask { public: - SweeperTask(Sweeper* sweeper, base::Semaphore* pending_sweeper_tasks, + SweeperTask(Isolate* isolate, Sweeper* sweeper, + base::Semaphore* pending_sweeper_tasks, base::AtomicNumber<intptr_t>* num_sweeping_tasks, AllocationSpace space_to_start) - : sweeper_(sweeper), + : CancelableTask(isolate), + sweeper_(sweeper), pending_sweeper_tasks_(pending_sweeper_tasks), num_sweeping_tasks_(num_sweeping_tasks), space_to_start_(space_to_start) {} @@ -559,8 +562,7 @@ class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task { virtual ~SweeperTask() {} private: - // v8::Task overrides. - void Run() override { + void RunInternal() final { DCHECK_GE(space_to_start_, FIRST_SPACE); DCHECK_LE(space_to_start_, LAST_PAGED_SPACE); const int offset = space_to_start_ - FIRST_SPACE; @@ -575,9 +577,9 @@ class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task { pending_sweeper_tasks_->Signal(); } - Sweeper* sweeper_; - base::Semaphore* pending_sweeper_tasks_; - base::AtomicNumber<intptr_t>* num_sweeping_tasks_; + Sweeper* const sweeper_; + base::Semaphore* const pending_sweeper_tasks_; + base::AtomicNumber<intptr_t>* const num_sweeping_tasks_; AllocationSpace space_to_start_; DISALLOW_COPY_AND_ASSIGN(SweeperTask); @@ -595,15 +597,19 @@ void MarkCompactCollector::Sweeper::StartSweeping() { } void MarkCompactCollector::Sweeper::StartSweeperTasks() { + DCHECK_EQ(0, num_tasks_); + DCHECK_EQ(0, num_sweeping_tasks_.Value()); if (FLAG_concurrent_sweeping && sweeping_in_progress_) { ForAllSweepingSpaces([this](AllocationSpace space) { if (space == NEW_SPACE) return; num_sweeping_tasks_.Increment(1); - semaphore_counter_++; + SweeperTask* task = new SweeperTask(heap_->isolate(), this, + &pending_sweeper_tasks_semaphore_, + &num_sweeping_tasks_, space); + DCHECK_LT(num_tasks_, kMaxSweeperTasks); + task_ids_[num_tasks_++] = task->id(); V8::GetCurrentPlatform()->CallOnBackgroundThread( - new SweeperTask(this, &pending_sweeper_tasks_semaphore_, - &num_sweeping_tasks_, space), - v8::Platform::kShortRunningTask); + task, v8::Platform::kShortRunningTask); }); } } @@ -646,10 +652,14 @@ void MarkCompactCollector::Sweeper::EnsureCompleted() { [this](AllocationSpace space) { ParallelSweepSpace(space, 0); }); if (FLAG_concurrent_sweeping) { - while (semaphore_counter_ > 0) { - pending_sweeper_tasks_semaphore_.Wait(); - semaphore_counter_--; + for (int i = 0; i < num_tasks_; i++) { + if (heap_->isolate()->cancelable_task_manager()->TryAbort(task_ids_[i]) != + CancelableTaskManager::kTaskAborted) { + pending_sweeper_tasks_semaphore_.Wait(); + } } + num_tasks_ = 0; + num_sweeping_tasks_.SetValue(0); } ForAllSweepingSpaces([this](AllocationSpace space) { diff --git a/deps/v8/src/heap/mark-compact.h b/deps/v8/src/heap/mark-compact.h index 24ec7043ab..2babbc9296 100644 --- a/deps/v8/src/heap/mark-compact.h +++ b/deps/v8/src/heap/mark-compact.h @@ -408,8 +408,6 @@ class MarkCompactCollector final : public MarkCompactCollectorBase { class Sweeper { public: - class SweeperTask; - enum FreeListRebuildingMode { REBUILD_FREE_LIST, IGNORE_FREE_LIST }; enum ClearOldToNewSlotsMode { DO_NOT_CLEAR, @@ -425,8 +423,8 @@ class MarkCompactCollector final : public MarkCompactCollectorBase { explicit Sweeper(Heap* heap) : heap_(heap), + num_tasks_(0), pending_sweeper_tasks_semaphore_(0), - semaphore_counter_(0), sweeping_in_progress_(false), num_sweeping_tasks_(0) {} @@ -452,7 +450,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase { Page* GetSweptPageSafe(PagedSpace* space); private: + class SweeperTask; + static const int kAllocationSpaces = LAST_PAGED_SPACE + 1; + static const int kMaxSweeperTasks = kAllocationSpaces; static ClearOldToNewSlotsMode GetClearOldToNewSlotsMode(Page* p); @@ -468,10 +469,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase { void PrepareToBeSweptPage(AllocationSpace space, Page* page); - Heap* heap_; + Heap* const heap_; + int num_tasks_; + uint32_t task_ids_[kMaxSweeperTasks]; base::Semaphore pending_sweeper_tasks_semaphore_; - // Counter is only used for waiting on the semaphore. - intptr_t semaphore_counter_; base::Mutex mutex_; SweptList swept_list_[kAllocationSpaces]; SweepingList sweeping_list_[kAllocationSpaces]; |