Broom 1.0.0
A thread-local C++ Garbage Collector
Loading...
Searching...
No Matches
roots.h
Go to the documentation of this file.
1#pragma once
2
3#include <absl/container/btree_set.h>
4
5#include <cstdint>
6#include <list>
7#include <type_traits>
8
9#include "include/broom.h"
10#include "src/allocator.h"
11#include "src/globals.h"
12
13namespace broom {
14enum class RootKind {
15 kStack, // No special class
16 kExternal, // class ExternalRoot
17 kPrecise, // class PreciseRoot
18 kRegular, // Heap pointer, no special class.
19};
20
21// An external root is one that was explicitly registered with Broom with a
22// given base pointer and size. The base pointer can be a managed or unmanaged
23// root, but any pointers inside of the region must be pointer-aligned.
25 private:
26 static bool SetCompareFn(const ExternalRoot& r1, const ExternalRoot& r2) {
27 return SafeCast<MemoryAddress>(r1.Pointer()) <
28 SafeCast<MemoryAddress>(r2.Pointer());
29 }
30
31 public:
32 static constexpr const RootKind kRootKind = RootKind::kExternal;
33 explicit ExternalRoot(UintPtr pointer, size_t size)
34 : pointer_(pointer), size_(size) {}
35 explicit ExternalRoot(const void* pointer, size_t size)
36 : pointer_(SafeCast<UintPtr>(pointer)), size_(size) {}
37 ~ExternalRoot() = default;
38
39 const void* const* Start() const {
40 return SafeCast<const void* const*>(pointer_);
41 }
42 const void* Pointer() const { return SafeCast<const void*>(pointer_); }
43 const void* const* End() const {
44 return SafeCast<const void* const*>(pointer_ + size_);
45 }
46
47 UintPtr StartUintPtr() const { return pointer_; }
48 UintPtr EndUintPtr() const { return pointer_ + size_; }
49
50 using SetCompare =
51 std::integral_constant<decltype(&SetCompareFn), &SetCompareFn>;
52
53 private:
54 UintPtr pointer_;
55 size_t size_;
56};
57
58static_assert(std::is_trivially_destructible_v<ExternalRoot>);
59static_assert(sizeof(ExternalRoot) == kPointerSize + sizeof(size_t));
60
62
63// A precise root is created by inheriting from the BroomValue/gc_root class and
64// calling its constructor. Any precise root must have a
65//
66// void Visit(Visitor*) const;
67//
68// method implemented, as this method will be called during the marking phase of
69// the GC, allowing each root to mark its own pointer members.
71 public:
72 static constexpr const RootKind kRootKind = RootKind::kPrecise;
74 : broom_value_(SafeCast<const BroomValue*>(pointer)) {}
75 explicit PreciseRoot(const void* pointer)
76 : broom_value_(SafeCast<const BroomValue*>(pointer)) {}
77 const BroomValue* Class() const { return broom_value_; }
78
79 private:
80 using List = std::list<PreciseRoot>;
81 using Reference = List::iterator;
82 const Reference GetReference() const { return reference_in_list_; }
83 void UpdateReference(PreciseRoot::Reference ref) { reference_in_list_ = ref; }
84
85 const BroomValue* broom_value_;
86 Reference reference_in_list_;
87 friend class GarbageCollector;
88};
89
90// The main visitor for our roots. Its responsibility is to recursively visit
91// every managed pointer from a given root. RootVisitor also exposes
92// IterateStackAndVisitStackRoots, which iterates through the thread's stack
93// from top to bottom, visiting each pointer.
94class RootVisitor : public Visitor {
95 public:
97 : allocator_(allocator), gc_(gc) {}
98 virtual void Visit(const void* pointer) { VisitRegularRoot(pointer); }
100 template <RootKind kind>
101 void Visit(const void* root);
102
103 private:
104 void VisitRegularRoot(const void* pointer);
105 void VisitStackRoot(const void* pointer);
106 void VisitExternalRoot(const ExternalRoot* external_root);
107 void VisitPreciseRoot(const PreciseRoot* precise_root);
108
109 Allocator* allocator_;
110 GarbageCollector* gc_;
111};
112} // namespace broom
~ExternalRoot()=default
ExternalRoot(UintPtr pointer, size_t size)
Definition roots.h:33
const void * Pointer() const
Definition roots.h:42
ExternalRoot(const void *pointer, size_t size)
Definition roots.h:35
static constexpr const RootKind kRootKind
Definition roots.h:32
std::integral_constant< decltype(&SetCompareFn), &SetCompareFn > SetCompare
Definition roots.h:51
UintPtr EndUintPtr() const
Definition roots.h:48
UintPtr StartUintPtr() const
Definition roots.h:47
const void *const * Start() const
Definition roots.h:39
const void *const * End() const
Definition roots.h:43
const BroomValue * Class() const
Definition roots.h:77
static constexpr const RootKind kRootKind
Definition roots.h:72
PreciseRoot(UintPtr pointer)
Definition roots.h:73
PreciseRoot(const void *pointer)
Definition roots.h:75
void IterateStackAndVisitRoots()
RootVisitor(Allocator *allocator, GarbageCollector *gc)
Definition roots.h:96
virtual void Visit(const void *pointer)
Definition roots.h:98
constexpr const int kPointerSize
Definition globals.h:17
uintptr_t UintPtr
Definition globals.h:14
constexpr T SafeCast(U v)
Definition globals.h:48
RootKind
Definition roots.h:14
std::queue< T, broom::deque< T > > queue
Definition broom-queue.h:12