Skip to content

Commit a67e7f9

Browse files
Matt LoringMylesBorins
Matt Loring
authored andcommitted
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 <[email protected]> Reviewed-by: Ulan Degenbaev <[email protected]> Cr-Commit-Position: refs/heads/master@{#47036} PR-URL: #14001 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent 6e2f622 commit a67e7f9

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

deps/v8/src/heap/mark-compact.cc

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "src/base/atomicops.h"
88
#include "src/base/bits.h"
99
#include "src/base/sys-info.h"
10+
#include "src/cancelable-task.h"
1011
#include "src/code-stubs.h"
1112
#include "src/compilation-cache.h"
1213
#include "src/deoptimizer.h"
@@ -546,21 +547,22 @@ void MarkCompactCollector::ClearMarkbits() {
546547
heap_->lo_space()->ClearMarkingStateOfLiveObjects();
547548
}
548549

549-
class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task {
550+
class MarkCompactCollector::Sweeper::SweeperTask final : public CancelableTask {
550551
public:
551-
SweeperTask(Sweeper* sweeper, base::Semaphore* pending_sweeper_tasks,
552+
SweeperTask(Isolate* isolate, Sweeper* sweeper,
553+
base::Semaphore* pending_sweeper_tasks,
552554
base::AtomicNumber<intptr_t>* num_sweeping_tasks,
553555
AllocationSpace space_to_start)
554-
: sweeper_(sweeper),
556+
: CancelableTask(isolate),
557+
sweeper_(sweeper),
555558
pending_sweeper_tasks_(pending_sweeper_tasks),
556559
num_sweeping_tasks_(num_sweeping_tasks),
557560
space_to_start_(space_to_start) {}
558561

559562
virtual ~SweeperTask() {}
560563

561564
private:
562-
// v8::Task overrides.
563-
void Run() override {
565+
void RunInternal() final {
564566
DCHECK_GE(space_to_start_, FIRST_SPACE);
565567
DCHECK_LE(space_to_start_, LAST_PAGED_SPACE);
566568
const int offset = space_to_start_ - FIRST_SPACE;
@@ -575,9 +577,9 @@ class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task {
575577
pending_sweeper_tasks_->Signal();
576578
}
577579

578-
Sweeper* sweeper_;
579-
base::Semaphore* pending_sweeper_tasks_;
580-
base::AtomicNumber<intptr_t>* num_sweeping_tasks_;
580+
Sweeper* const sweeper_;
581+
base::Semaphore* const pending_sweeper_tasks_;
582+
base::AtomicNumber<intptr_t>* const num_sweeping_tasks_;
581583
AllocationSpace space_to_start_;
582584

583585
DISALLOW_COPY_AND_ASSIGN(SweeperTask);
@@ -595,15 +597,19 @@ void MarkCompactCollector::Sweeper::StartSweeping() {
595597
}
596598

597599
void MarkCompactCollector::Sweeper::StartSweeperTasks() {
600+
DCHECK_EQ(0, num_tasks_);
601+
DCHECK_EQ(0, num_sweeping_tasks_.Value());
598602
if (FLAG_concurrent_sweeping && sweeping_in_progress_) {
599603
ForAllSweepingSpaces([this](AllocationSpace space) {
600604
if (space == NEW_SPACE) return;
601605
num_sweeping_tasks_.Increment(1);
602-
semaphore_counter_++;
606+
SweeperTask* task = new SweeperTask(heap_->isolate(), this,
607+
&pending_sweeper_tasks_semaphore_,
608+
&num_sweeping_tasks_, space);
609+
DCHECK_LT(num_tasks_, kMaxSweeperTasks);
610+
task_ids_[num_tasks_++] = task->id();
603611
V8::GetCurrentPlatform()->CallOnBackgroundThread(
604-
new SweeperTask(this, &pending_sweeper_tasks_semaphore_,
605-
&num_sweeping_tasks_, space),
606-
v8::Platform::kShortRunningTask);
612+
task, v8::Platform::kShortRunningTask);
607613
});
608614
}
609615
}
@@ -646,10 +652,14 @@ void MarkCompactCollector::Sweeper::EnsureCompleted() {
646652
[this](AllocationSpace space) { ParallelSweepSpace(space, 0); });
647653

648654
if (FLAG_concurrent_sweeping) {
649-
while (semaphore_counter_ > 0) {
650-
pending_sweeper_tasks_semaphore_.Wait();
651-
semaphore_counter_--;
655+
for (int i = 0; i < num_tasks_; i++) {
656+
if (heap_->isolate()->cancelable_task_manager()->TryAbort(task_ids_[i]) !=
657+
CancelableTaskManager::kTaskAborted) {
658+
pending_sweeper_tasks_semaphore_.Wait();
659+
}
652660
}
661+
num_tasks_ = 0;
662+
num_sweeping_tasks_.SetValue(0);
653663
}
654664

655665
ForAllSweepingSpaces([this](AllocationSpace space) {

deps/v8/src/heap/mark-compact.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,6 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
408408

409409
class Sweeper {
410410
public:
411-
class SweeperTask;
412-
413411
enum FreeListRebuildingMode { REBUILD_FREE_LIST, IGNORE_FREE_LIST };
414412
enum ClearOldToNewSlotsMode {
415413
DO_NOT_CLEAR,
@@ -425,8 +423,8 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
425423

426424
explicit Sweeper(Heap* heap)
427425
: heap_(heap),
426+
num_tasks_(0),
428427
pending_sweeper_tasks_semaphore_(0),
429-
semaphore_counter_(0),
430428
sweeping_in_progress_(false),
431429
num_sweeping_tasks_(0) {}
432430

@@ -452,7 +450,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
452450
Page* GetSweptPageSafe(PagedSpace* space);
453451

454452
private:
453+
class SweeperTask;
454+
455455
static const int kAllocationSpaces = LAST_PAGED_SPACE + 1;
456+
static const int kMaxSweeperTasks = kAllocationSpaces;
456457

457458
static ClearOldToNewSlotsMode GetClearOldToNewSlotsMode(Page* p);
458459

@@ -468,10 +469,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
468469

469470
void PrepareToBeSweptPage(AllocationSpace space, Page* page);
470471

471-
Heap* heap_;
472+
Heap* const heap_;
473+
int num_tasks_;
474+
uint32_t task_ids_[kMaxSweeperTasks];
472475
base::Semaphore pending_sweeper_tasks_semaphore_;
473-
// Counter is only used for waiting on the semaphore.
474-
intptr_t semaphore_counter_;
475476
base::Mutex mutex_;
476477
SweptList swept_list_[kAllocationSpaces];
477478
SweepingList sweeping_list_[kAllocationSpaces];

0 commit comments

Comments
 (0)