From 728886e38902d3133f2d94e59387d87fe800ace6 Mon Sep 17 00:00:00 2001 From: Dimitar Trendafilov Date: Mon, 20 Sep 2021 21:48:02 +0300 Subject: Move files to match other projects --- gctest/src/gc_dummy.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 gctest/src/gc_dummy.cpp (limited to 'gctest/src/gc_dummy.cpp') diff --git a/gctest/src/gc_dummy.cpp b/gctest/src/gc_dummy.cpp new file mode 100644 index 0000000..68fc86d --- /dev/null +++ b/gctest/src/gc_dummy.cpp @@ -0,0 +1,71 @@ +#include + +#include "gc.h" + +class DummyGC : public GarbageCollector +{ +public: + DummyGC(unsigned gcInterval) + : m_GCInterval(gcInterval) + {} + + void* Allocate(size_t size) override { + if (++m_AllocsSinceGC == m_GCInterval) + { + GC(); + m_AllocsSinceGC = 0; + } + auto memory = ::operator new(size); + m_Allocated.insert(static_cast(memory)); + return memory; + } + + void SetRoot(Object** root) override { m_Root = root; } + + void VisitReference(Object*, Object** to, void*) override + { + auto insert = m_Visited.insert(*to); + if (insert.second) + { + (*to)->VisitReferences(this, nullptr); + } + } + + void GC() + { + m_Visited.clear(); + m_Visited.insert(*m_Root); + (*m_Root)->VisitReferences(this, nullptr); + + for (auto object: m_Allocated) + { + if (m_Visited.find(object) == m_Visited.end()) + { + object->~Object(); + ::operator delete(object); + } + } + m_Allocated = m_Visited; + } + + void Shutdown() override + { + for (auto object: m_Allocated) + { + object->~Object(); + ::operator delete(object); + } + + } + + Object** m_Root; + std::unordered_set m_Allocated; + std::unordered_set m_Visited; + unsigned m_GCInterval; + unsigned m_AllocsSinceGC = 0; +}; + +std::unique_ptr CreateGarbageCollector(int, char*[]) +{ + return std::unique_ptr(new DummyGC(1024)); +} -- cgit v1.3.1-23-gd82d