// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #ifdef __linux__ #include #include #include #include #include #endif #include #include "src/v8.h" #include "src/global-handles.h" #include "src/heap/incremental-marking.h" #include "src/heap/spaces.h" #include "src/objects-inl.h" #include "test/cctest/cctest.h" #include "test/cctest/heap/heap-utils.h" using v8::IdleTask; using v8::Task; using v8::Isolate; namespace v8 { namespace internal { namespace heap { class MockPlatform : public TestPlatform { public: MockPlatform() : task_(nullptr), old_platform_(i::V8::GetCurrentPlatform()) { // Now that it's completely constructed, make this the current platform. i::V8::SetPlatformForTesting(this); } virtual ~MockPlatform() { delete task_; i::V8::SetPlatformForTesting(old_platform_); for (auto& task : worker_tasks_) { old_platform_->CallOnWorkerThread(std::move(task)); } worker_tasks_.clear(); } void CallOnForegroundThread(v8::Isolate* isolate, Task* task) override { task_ = task; } void CallOnWorkerThread(std::unique_ptr task) override { worker_tasks_.push_back(std::move(task)); } bool IdleTasksEnabled(v8::Isolate* isolate) override { return false; } bool PendingTask() { return task_ != nullptr; } void PerformTask() { Task* task = task_; task_ = nullptr; task->Run(); delete task; } private: Task* task_; std::vector> worker_tasks_; v8::Platform* old_platform_; }; TEST(IncrementalMarkingUsingTasks) { if (!i::FLAG_incremental_marking) return; FLAG_stress_incremental_marking = false; CcTest::InitializeVM(); MockPlatform platform; i::heap::SimulateFullSpace(CcTest::heap()->old_space()); i::IncrementalMarking* marking = CcTest::heap()->incremental_marking(); marking->Stop(); marking->Start(i::GarbageCollectionReason::kTesting); CHECK(platform.PendingTask()); while (platform.PendingTask()) { platform.PerformTask(); } CHECK(marking->IsStopped()); } } // namespace heap } // namespace internal } // namespace v8