3#include <absl/container/btree_set.h>
31 const void*
Pointer()
const {
return pointer_; }
36 std::integral_constant<
decltype(&SetCompareFn), &SetCompareFn>;
47 static constexpr auto cmp_helper = []<
typename T>(
const T&
n1,
const T&
n2) {
54 using GcSet = absl::btree_set<GcNode, GcNode::SetCompare>;
56 absl::btree_set<ExternalRoot, ExternalRoot::SetCompare>;
60 allocator_(allocator),
62 BENSURE_NE(allocator_,
nullptr,
"Failed to allocate the allocator");
71 "Must deallocate all external roots, have: {}",
72 external_roots_.size());
74 "Must deallocate all precise roots, have {}",
75 precise_roots_.size());
76 BASSERT_EQ(to_collect_.size(), 0,
"Exited during collection.");
82 for (
auto it = alive_.begin();
it != alive_.end(); ++
it) {
83 if (
it->HasDestructor()) {
101 auto it = std::ranges::find(to_collect_,
pointer, &GcNode::pointer_);
103 if (
it == to_collect_.end())
return;
105 to_collect_.erase(
it);
108 external_roots_.emplace(std::move(
root));
111 external_roots_.erase(std::move(
root));
115 auto it = precise_roots_.begin();
121 precise_roots_.erase(
root->GetReference());
151#ifdef BROOM_FOR_TESTING
155 template <
typename T,
typename...
Args>
170#ifdef BROOM_FOR_TESTING
184 Allocator* allocator_;
186 PreciseRoot::List precise_roots_;
187 RootVisitor root_visitor_;
190 bool collect_ =
true;
#define __BROOM_IMPL_ALLOCATE_T(T, RegisterFunction, AllocateFunction, args)
static void UnpinBasePointer(const void *pointer)
MemoryPressure CalculateMemoryPressure() const
static void PinBasePointer(const void *pointer, uint32_t how_many)
virtual void * Allocate(size_t requested_size)=0
BROOM_INLINE void RegisterExternalRoot(ExternalRoot root)
BROOM_INLINE void RegisterPointer(const void *pointer, Destructor destructor=nullptr)
absl::btree_set< GcNode, GcNode::SetCompare > GcSet
void * AllocateRawDontRegister(size_t size)
BROOM_INLINE void EnableAutomatedCollection()
void MarkAlive(const void *pointer)
BROOM_INLINE void UnregisterExternalRoot(ExternalRoot root)
BROOM_INLINE void DisableAutomatedCollection()
void ForceSlowCollection()
GarbageCollector(Allocator *allocator)
GarbageCollector(broom_configuration config)
BROOM_INLINE void * RegisterPreciseRoot(PreciseRoot root)
absl::btree_set< ExternalRoot, ExternalRoot::SetCompare > ExternalRootSet
GarbageCollector(broom_configuration config, Allocator *allocator)
BROOM_INLINE void Pin(const void *pointer, uint32_t how_many=1)
BROOM_INLINE void Unpin(const void *pointer)
BROOM_INLINE void CollectIfNecessary()
BROOM_INLINE void UnregisterPreciseRoot(void *type_erased_root)
void ForceFastCollection()
GcNode(const void *pointer)
bool HasDestructor() const
GcNode(const void *pointer, Destructor destructor)
void RunDestructor() const
const void * Pointer() const
std::integral_constant< decltype(&SetCompareFn), &SetCompareFn > SetCompare
#define BASSERT_EQ(lhs, rhs, m,...)
#define BENSURE_NE(lhs, rhs, m,...)
std::add_pointer< void(const void *)>::type Destructor
std::queue< T, broom::deque< T > > queue
bool run_destructors_on_shutdown