// Copyright 2018 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 "src/v8.h" #include "src/heap/spaces.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 MockPlatformForUnmapper : public TestPlatform { public: MockPlatformForUnmapper() : task_(nullptr), old_platform_(i::V8::GetCurrentPlatform()) { // Now that it's completely constructed, make this the current platform. i::V8::SetPlatformForTesting(this); } ~MockPlatformForUnmapper() override { 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; } int NumberOfWorkerThreads() override { return old_platform_->NumberOfWorkerThreads(); } private: Task* task_; std::vector> worker_tasks_; v8::Platform* old_platform_; }; TEST(EagerUnmappingInCollectAllAvailableGarbage) { CcTest::InitializeVM(); MockPlatformForUnmapper platform; Heap* heap = CcTest::heap(); i::heap::SimulateFullSpace(heap->old_space()); CcTest::CollectAllAvailableGarbage(); CHECK_EQ(0, heap->memory_allocator()->unmapper()->NumberOfChunks()); } } // namespace heap } // namespace internal } // namespace v8