1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_TEST_UTILITIES_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_TEST_UTILITIES_H_
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/platform/heap/thread_state.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "v8/include/cppgc/testing.h"
#include "v8/include/v8.h"
#include "v8/include/v8-cppgc.h"
namespace blink {
// Allows for overriding the stack state for the purpose of testing. Any garbage
// collection calls scoped with `HeapPointersOnStackScope` will perform
// conservative stack scanning, even if other (more local) hints indicate that
// there's no need for it.
class HeapPointersOnStackScope final {
STACK_ALLOCATED();
public:
explicit HeapPointersOnStackScope(const ThreadState* state)
: embedder_stack_state_(
state->cpp_heap().GetHeapHandle(),
cppgc::EmbedderStackState::kMayContainHeapPointers) {}
HeapPointersOnStackScope(const HeapPointersOnStackScope&) = delete;
HeapPointersOnStackScope& operator=(const HeapPointersOnStackScope&) = delete;
private:
cppgc::testing::OverrideEmbedderStackStateScope embedder_stack_state_;
};
class TestSupportingGC : public testing::Test {
public:
~TestSupportingGC() override;
// Performs a precise garbage collection with eager sweeping.
static void PreciselyCollectGarbage();
// Performs a conservative garbage collection with eager sweeping.
static void ConservativelyCollectGarbage();
// Performs multiple rounds of garbage collections until no more memory can be
// freed. This is useful to avoid other garbage collections having to deal
// with stale memory.
static void ClearOutOldGarbage();
protected:
base::test::TaskEnvironment task_environment_;
};
// Test driver for compaction.
class CompactionTestDriver {
public:
explicit CompactionTestDriver(ThreadState*);
void ForceCompactionForNextGC();
protected:
cppgc::testing::StandaloneTestingHeap heap_;
};
// Test driver for incremental marking. Assumes that no stack handling is
// required.
class IncrementalMarkingTestDriver {
public:
explicit IncrementalMarkingTestDriver(ThreadState*);
~IncrementalMarkingTestDriver();
virtual void StartGC();
virtual void TriggerMarkingSteps();
virtual void FinishGC();
void TriggerMarkingStepsWithStack();
protected:
cppgc::testing::StandaloneTestingHeap heap_;
};
// Test driver for concurrent marking. Assumes that no stack handling is
// required.
class ConcurrentMarkingTestDriver : public IncrementalMarkingTestDriver {
public:
explicit ConcurrentMarkingTestDriver(ThreadState*);
void StartGC() override;
void TriggerMarkingSteps() override;
void FinishGC() override;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_TEST_UTILITIES_H_
|