Skip to content

Commit 2601a51

Browse files
Matt LoringMylesBorins
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} Backport-PR-URL: #15393 PR-URL: #14001 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent ede9d2e commit 2601a51

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
@@ -9,6 +9,7 @@
99
#include "src/base/atomicops.h"
1010
#include "src/base/bits.h"
1111
#include "src/base/sys-info.h"
12+
#include "src/cancelable-task.h"
1213
#include "src/code-stubs.h"
1314
#include "src/compilation-cache.h"
1415
#include "src/deoptimizer.h"
@@ -569,21 +570,22 @@ void MarkCompactCollector::ClearMarkbits() {
569570
heap_->lo_space()->ClearMarkingStateOfLiveObjects();
570571
}
571572

572-
class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task {
573+
class MarkCompactCollector::Sweeper::SweeperTask final : public CancelableTask {
573574
public:
574-
SweeperTask(Sweeper* sweeper, base::Semaphore* pending_sweeper_tasks,
575+
SweeperTask(Isolate* isolate, Sweeper* sweeper,
576+
base::Semaphore* pending_sweeper_tasks,
575577
base::AtomicNumber<intptr_t>* num_sweeping_tasks,
576578
AllocationSpace space_to_start)
577-
: sweeper_(sweeper),
579+
: CancelableTask(isolate),
580+
sweeper_(sweeper),
578581
pending_sweeper_tasks_(pending_sweeper_tasks),
579582
num_sweeping_tasks_(num_sweeping_tasks),
580583
space_to_start_(space_to_start) {}
581584

582585
virtual ~SweeperTask() {}
583586

584587
private:
585-
// v8::Task overrides.
586-
void Run() override {
588+
void RunInternal() final {
587589
DCHECK_GE(space_to_start_, FIRST_SPACE);
588590
DCHECK_LE(space_to_start_, LAST_PAGED_SPACE);
589591
const int offset = space_to_start_ - FIRST_SPACE;
@@ -598,9 +600,9 @@ class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task {
598600
pending_sweeper_tasks_->Signal();
599601
}
600602

601-
Sweeper* sweeper_;
602-
base::Semaphore* pending_sweeper_tasks_;
603-
base::AtomicNumber<intptr_t>* num_sweeping_tasks_;
603+
Sweeper* const sweeper_;
604+
base::Semaphore* const pending_sweeper_tasks_;
605+
base::AtomicNumber<intptr_t>* const num_sweeping_tasks_;
604606
AllocationSpace space_to_start_;
605607

606608
DISALLOW_COPY_AND_ASSIGN(SweeperTask);
@@ -618,15 +620,19 @@ void MarkCompactCollector::Sweeper::StartSweeping() {
618620
}
619621

620622
void MarkCompactCollector::Sweeper::StartSweeperTasks() {
623+
DCHECK_EQ(0, num_tasks_);
624+
DCHECK_EQ(0, num_sweeping_tasks_.Value());
621625
if (FLAG_concurrent_sweeping && sweeping_in_progress_) {
622626
ForAllSweepingSpaces([this](AllocationSpace space) {
623627
if (space == NEW_SPACE) return;
624628
num_sweeping_tasks_.Increment(1);
625-
semaphore_counter_++;
629+
SweeperTask* task = new SweeperTask(heap_->isolate(), this,
630+
&pending_sweeper_tasks_semaphore_,
631+
&num_sweeping_tasks_, space);
632+
DCHECK_LT(num_tasks_, kMaxSweeperTasks);
633+
task_ids_[num_tasks_++] = task->id();
626634
V8::GetCurrentPlatform()->CallOnBackgroundThread(
627-
new SweeperTask(this, &pending_sweeper_tasks_semaphore_,
628-
&num_sweeping_tasks_, space),
629-
v8::Platform::kShortRunningTask);
635+
task, v8::Platform::kShortRunningTask);
630636
});
631637
}
632638
}
@@ -671,10 +677,14 @@ void MarkCompactCollector::Sweeper::EnsureCompleted() {
671677
[this](AllocationSpace space) { ParallelSweepSpace(space, 0); });
672678

673679
if (FLAG_concurrent_sweeping) {
674-
while (semaphore_counter_ > 0) {
675-
pending_sweeper_tasks_semaphore_.Wait();
676-
semaphore_counter_--;
680+
for (int i = 0; i < num_tasks_; i++) {
681+
if (heap_->isolate()->cancelable_task_manager()->TryAbort(task_ids_[i]) !=
682+
CancelableTaskManager::kTaskAborted) {
683+
pending_sweeper_tasks_semaphore_.Wait();
684+
}
677685
}
686+
num_tasks_ = 0;
687+
num_sweeping_tasks_.SetValue(0);
678688
}
679689

680690
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
@@ -491,8 +491,6 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
491491

492492
class Sweeper {
493493
public:
494-
class SweeperTask;
495-
496494
enum FreeListRebuildingMode { REBUILD_FREE_LIST, IGNORE_FREE_LIST };
497495
enum ClearOldToNewSlotsMode {
498496
DO_NOT_CLEAR,
@@ -508,8 +506,8 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
508506

509507
explicit Sweeper(Heap* heap)
510508
: heap_(heap),
509+
num_tasks_(0),
511510
pending_sweeper_tasks_semaphore_(0),
512-
semaphore_counter_(0),
513511
sweeping_in_progress_(false),
514512
num_sweeping_tasks_(0) {}
515513

@@ -535,7 +533,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
535533
Page* GetSweptPageSafe(PagedSpace* space);
536534

537535
private:
536+
class SweeperTask;
537+
538538
static const int kAllocationSpaces = LAST_PAGED_SPACE + 1;
539+
static const int kMaxSweeperTasks = kAllocationSpaces;
539540

540541
static ClearOldToNewSlotsMode GetClearOldToNewSlotsMode(Page* p);
541542

@@ -550,10 +551,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
550551

551552
void PrepareToBeSweptPage(AllocationSpace space, Page* page);
552553

553-
Heap* heap_;
554+
Heap* const heap_;
555+
int num_tasks_;
556+
uint32_t task_ids_[kMaxSweeperTasks];
554557
base::Semaphore pending_sweeper_tasks_semaphore_;
555-
// Counter is only used for waiting on the semaphore.
556-
intptr_t semaphore_counter_;
557558
base::Mutex mutex_;
558559
SweptList swept_list_[kAllocationSpaces];
559560
SweepingList sweeping_list_[kAllocationSpaces];

0 commit comments

Comments
 (0)