6a1a3a101e
This CL adds tracing scopes for the various cppgc classes. Scopes use TRACE_EVENT_BEGIN and TRACE_EVENT_END macros to report trace events. To do so they need to include trace-event.h. For unified heap builds, trace-event.h forwards to v8's src/tracing/trace-event.h. For other builds, trace-event.h provides a subset of src/tracing/trace-event.h that covers just the parts used by cppgc. This CL covers what we need for traces and blink gc metrics (up to renaming events from BlinkGC.* to CppGC.*). UMA and UKM are not yet handled. Bug: chromium:1056170 Change-Id: Id92e84b27259ff0aadae7692f3d79d30896fb8e7 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2540548 Commit-Queue: Omer Katz <omerkatz@chromium.org> Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Cr-Commit-Position: refs/heads/master@{#71284}
146 lines
5.6 KiB
C++
146 lines
5.6 KiB
C++
// Copyright 2020 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/heap/cppgc/gc-invoker.h"
|
|
|
|
#include "include/cppgc/platform.h"
|
|
#include "src/heap/cppgc/heap.h"
|
|
#include "test/unittests/heap/cppgc/test-platform.h"
|
|
#include "testing/gmock/include/gmock/gmock-matchers.h"
|
|
#include "testing/gmock/include/gmock/gmock.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace cppgc {
|
|
namespace internal {
|
|
|
|
namespace {
|
|
|
|
class MockGarbageCollector : public GarbageCollector {
|
|
public:
|
|
MOCK_METHOD(void, CollectGarbage, (GarbageCollector::Config), (override));
|
|
MOCK_METHOD(void, StartIncrementalGarbageCollection,
|
|
(GarbageCollector::Config), (override));
|
|
MOCK_METHOD(size_t, epoch, (), (const, override));
|
|
};
|
|
|
|
class MockTaskRunner : public cppgc::TaskRunner {
|
|
public:
|
|
MOCK_METHOD(void, PostTask, (std::unique_ptr<cppgc::Task>), (override));
|
|
MOCK_METHOD(void, PostNonNestableTask, (std::unique_ptr<cppgc::Task>),
|
|
(override));
|
|
MOCK_METHOD(void, PostDelayedTask, (std::unique_ptr<cppgc::Task>, double),
|
|
(override));
|
|
MOCK_METHOD(void, PostNonNestableDelayedTask,
|
|
(std::unique_ptr<cppgc::Task>, double), (override));
|
|
MOCK_METHOD(void, PostIdleTask, (std::unique_ptr<cppgc::IdleTask>),
|
|
(override));
|
|
|
|
virtual bool IdleTasksEnabled() override { return true; } // NOLINT
|
|
bool NonNestableTasksEnabled() const override { return true; } // NOLINT
|
|
virtual bool NonNestableDelayedTasksEnabled() const override { // NOLINT
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class MockPlatform : public cppgc::Platform {
|
|
public:
|
|
explicit MockPlatform(std::shared_ptr<TaskRunner> runner)
|
|
: runner_(std::move(runner)),
|
|
tracing_controller_(std::make_unique<TracingController>()) {}
|
|
|
|
PageAllocator* GetPageAllocator() override { return nullptr; }
|
|
double MonotonicallyIncreasingTime() override { return 0.0; }
|
|
|
|
std::shared_ptr<TaskRunner> GetForegroundTaskRunner() override {
|
|
return runner_;
|
|
}
|
|
|
|
TracingController* GetTracingController() override {
|
|
return tracing_controller_.get();
|
|
}
|
|
|
|
private:
|
|
std::shared_ptr<TaskRunner> runner_;
|
|
std::unique_ptr<TracingController> tracing_controller_;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
TEST(GCInvokerTest, PrecideGCIsInvokedSynchronously) {
|
|
MockPlatform platform(nullptr);
|
|
MockGarbageCollector gc;
|
|
GCInvoker invoker(&gc, &platform,
|
|
cppgc::Heap::StackSupport::kNoConservativeStackScan);
|
|
EXPECT_CALL(gc, CollectGarbage(::testing::Field(
|
|
&GarbageCollector::Config::stack_state,
|
|
GarbageCollector::Config::StackState::kNoHeapPointers)));
|
|
invoker.CollectGarbage(GarbageCollector::Config::PreciseAtomicConfig());
|
|
}
|
|
|
|
TEST(GCInvokerTest, ConservativeGCIsInvokedSynchronouslyWhenSupported) {
|
|
MockPlatform platform(nullptr);
|
|
MockGarbageCollector gc;
|
|
GCInvoker invoker(&gc, &platform,
|
|
cppgc::Heap::StackSupport::kSupportsConservativeStackScan);
|
|
EXPECT_CALL(
|
|
gc, CollectGarbage(::testing::Field(
|
|
&GarbageCollector::Config::stack_state,
|
|
GarbageCollector::Config::StackState::kMayContainHeapPointers)));
|
|
invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
|
|
}
|
|
|
|
TEST(GCInvokerTest, ConservativeGCIsScheduledAsPreciseGCViaPlatform) {
|
|
std::shared_ptr<cppgc::TaskRunner> runner =
|
|
std::shared_ptr<cppgc::TaskRunner>(new MockTaskRunner());
|
|
MockPlatform platform(runner);
|
|
MockGarbageCollector gc;
|
|
GCInvoker invoker(&gc, &platform,
|
|
cppgc::Heap::StackSupport::kNoConservativeStackScan);
|
|
EXPECT_CALL(gc, epoch).WillOnce(::testing::Return(0));
|
|
EXPECT_CALL(*static_cast<MockTaskRunner*>(runner.get()),
|
|
PostNonNestableTask(::testing::_));
|
|
invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
|
|
}
|
|
|
|
TEST(GCInvokerTest, ConservativeGCIsInvokedAsPreciseGCViaPlatform) {
|
|
testing::TestPlatform platform;
|
|
MockGarbageCollector gc;
|
|
GCInvoker invoker(&gc, &platform,
|
|
cppgc::Heap::StackSupport::kNoConservativeStackScan);
|
|
EXPECT_CALL(gc, epoch).WillRepeatedly(::testing::Return(0));
|
|
EXPECT_CALL(gc, CollectGarbage);
|
|
invoker.CollectGarbage(GarbageCollector::Config::ConservativeAtomicConfig());
|
|
platform.RunAllForegroundTasks();
|
|
}
|
|
|
|
TEST(GCInvokerTest, IncrementalGCIsStarted) {
|
|
// Since StartIncrementalGarbageCollection doesn't scan the stack, support for
|
|
// conservative stack scanning should not matter.
|
|
MockPlatform platform(nullptr);
|
|
MockGarbageCollector gc;
|
|
// Conservative stack scanning supported.
|
|
GCInvoker invoker_with_support(
|
|
&gc, &platform,
|
|
cppgc::Heap::StackSupport::kSupportsConservativeStackScan);
|
|
EXPECT_CALL(
|
|
gc, StartIncrementalGarbageCollection(::testing::Field(
|
|
&GarbageCollector::Config::stack_state,
|
|
GarbageCollector::Config::StackState::kMayContainHeapPointers)));
|
|
invoker_with_support.StartIncrementalGarbageCollection(
|
|
GarbageCollector::Config::ConservativeIncrementalConfig());
|
|
// Conservative stack scanning *not* supported.
|
|
GCInvoker invoker_without_support(
|
|
&gc, &platform, cppgc::Heap::StackSupport::kNoConservativeStackScan);
|
|
EXPECT_CALL(
|
|
gc, StartIncrementalGarbageCollection(::testing::Field(
|
|
&GarbageCollector::Config::stack_state,
|
|
GarbageCollector::Config::StackState::kMayContainHeapPointers)))
|
|
.Times(0);
|
|
invoker_without_support.StartIncrementalGarbageCollection(
|
|
GarbageCollector::Config::ConservativeIncrementalConfig());
|
|
}
|
|
|
|
} // namespace internal
|
|
} // namespace cppgc
|