| Index: test/cctest/test-incremental-marking.cc
|
| diff --git a/test/cctest/test-incremental-marking.cc b/test/cctest/test-incremental-marking.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7a3645bf97a4f447d8ccfcb11446495995024cf0
|
| --- /dev/null
|
| +++ b/test/cctest/test-incremental-marking.cc
|
| @@ -0,0 +1,122 @@
|
| +// 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 <stdlib.h>
|
| +
|
| +#ifdef __linux__
|
| +#include <errno.h>
|
| +#include <fcntl.h>
|
| +#include <sys/stat.h>
|
| +#include <sys/types.h>
|
| +#include <unistd.h>
|
| +#endif
|
| +
|
| +#include <utility>
|
| +
|
| +#include "src/v8.h"
|
| +
|
| +#include "src/full-codegen/full-codegen.h"
|
| +#include "src/global-handles.h"
|
| +#include "test/cctest/cctest.h"
|
| +
|
| +using v8::IdleTask;
|
| +using v8::Task;
|
| +using v8::Isolate;
|
| +
|
| +
|
| +class MockPlatform : public v8::Platform {
|
| + public:
|
| + explicit MockPlatform(v8::Platform* platform)
|
| + : platform_(platform), idle_task_(nullptr) {}
|
| + virtual ~MockPlatform() {}
|
| +
|
| + void CallOnBackgroundThread(Task* task,
|
| + ExpectedRuntime expected_runtime) override {
|
| + platform_->CallOnBackgroundThread(task, expected_runtime);
|
| + }
|
| +
|
| + void CallOnForegroundThread(Isolate* isolate, Task* task) override {
|
| + platform_->CallOnForegroundThread(isolate, task);
|
| + }
|
| +
|
| + void CallDelayedOnForegroundThread(Isolate* isolate, Task* task,
|
| + double delay_in_seconds) override {
|
| + platform_->CallDelayedOnForegroundThread(isolate, task, delay_in_seconds);
|
| + }
|
| +
|
| + double MonotonicallyIncreasingTime() override {
|
| + return platform_->MonotonicallyIncreasingTime();
|
| + }
|
| +
|
| + void CallIdleOnForegroundThread(Isolate* isolate, IdleTask* task) override {
|
| + CHECK(nullptr == idle_task_);
|
| + idle_task_ = task;
|
| + }
|
| +
|
| + bool IdleTasksEnabled(Isolate* isolate) override { return true; }
|
| +
|
| + bool PendingIdleTask() { return idle_task_ != nullptr; }
|
| +
|
| + void PerformIdleTask(double idle_time_in_seconds) {
|
| + IdleTask* task = idle_task_;
|
| + idle_task_ = nullptr;
|
| + task->Run(MonotonicallyIncreasingTime() + idle_time_in_seconds);
|
| + delete task;
|
| + }
|
| +
|
| + private:
|
| + v8::Platform* platform_;
|
| + IdleTask* idle_task_;
|
| +};
|
| +
|
| +
|
| +TEST(IncrementalMarkingUsingIdleTasks) {
|
| + if (!i::FLAG_incremental_marking) return;
|
| + CcTest::InitializeVM();
|
| + v8::Platform* old_platform = i::V8::GetCurrentPlatform();
|
| + MockPlatform platform(old_platform);
|
| + i::V8::SetPlatformForTesting(&platform);
|
| + SimulateFullSpace(CcTest::heap()->old_space());
|
| + i::IncrementalMarking* marking = CcTest::heap()->incremental_marking();
|
| + marking->Abort();
|
| + marking->Start(i::Heap::kNoGCFlags);
|
| + CHECK(platform.PendingIdleTask());
|
| + const double kLongIdleTimeInSeconds = 1;
|
| + const double kShortIdleTimeInSeconds = 0.010;
|
| + const int kShortStepCount = 10;
|
| + for (int i = 0; i < kShortStepCount && platform.PendingIdleTask(); i++) {
|
| + platform.PerformIdleTask(kShortIdleTimeInSeconds);
|
| + }
|
| + while (platform.PendingIdleTask()) {
|
| + platform.PerformIdleTask(kLongIdleTimeInSeconds);
|
| + }
|
| + CHECK(marking->IsStopped());
|
| + i::V8::SetPlatformForTesting(old_platform);
|
| +}
|
| +
|
| +
|
| +TEST(IncrementalMarkingUsingIdleTasksAfterGC) {
|
| + if (!i::FLAG_incremental_marking) return;
|
| + CcTest::InitializeVM();
|
| + v8::Platform* old_platform = i::V8::GetCurrentPlatform();
|
| + MockPlatform platform(old_platform);
|
| + i::V8::SetPlatformForTesting(&platform);
|
| + SimulateFullSpace(CcTest::heap()->old_space());
|
| + CcTest::heap()->CollectAllGarbage();
|
| + i::IncrementalMarking* marking = CcTest::heap()->incremental_marking();
|
| + marking->Abort();
|
| + marking->Start(i::Heap::kNoGCFlags);
|
| + CHECK(platform.PendingIdleTask());
|
| + const double kLongIdleTimeInSeconds = 1;
|
| + const double kShortIdleTimeInSeconds = 0.010;
|
| + const int kShortStepCount = 10;
|
| + for (int i = 0; i < kShortStepCount && platform.PendingIdleTask(); i++) {
|
| + platform.PerformIdleTask(kShortIdleTimeInSeconds);
|
| + }
|
| + while (platform.PendingIdleTask()) {
|
| + platform.PerformIdleTask(kLongIdleTimeInSeconds);
|
| + }
|
| + CHECK(marking->IsStopped());
|
| + i::V8::SetPlatformForTesting(old_platform);
|
| +}
|
|
|