Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit020ef2292cbe47dbb72f17385a4448590ec52e6c (patch)
Author
 Dimitar Trendafilov <trendafilov.dn@gmail.com>
2020-12-25 09:11:06 +0200
Committer
 Dimitar Trendafilov <trendafilov.dn@gmail.com>
2021-09-13 22:25:45 +0300
Files0dc8d1a3c961d43a5c00bde0200cdf7c69025c50
IPL-020ef2292cbe47dbb72f17385a4448590ec52e6c.tar
IPL-020ef2292cbe47dbb72f17385a4448590ec52e6c.tar.gz
IPL-020ef2292cbe47dbb72f17385a4448590ec52e6c.zip
Parentb96d8490dbbd4c9b3cf231fa4e2b5ab87b376a25 (diff)
Add dummy GC implementation
2 files changed, 77 insertions, 0 deletions
-rw-r--r--gctest/gc_dummy.cpp71
-rw-r--r--gctest/genie.lua6
diff --git a/gctest/gc_dummy.cpp b/gctest/gc_dummy.cpp
new file mode 100644
index 0000000..8c321a4
--- /dev/null
+++ b/gctest/gc_dummy.cpp
@@ -0,0 +1,71 @@
+#include <memory>
+
+#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<Object*>(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<Object*> m_Allocated;
+ std::unordered_set<Object*> m_Visited;
+ unsigned m_GCInterval;
+ unsigned m_AllocsSinceGC = 0;
+};
+
+std::unique_ptr<GarbageCollector> CreateGarbageCollector(int&, const char*[])
+{
+ return std::unique_ptr<GarbageCollector>(new DummyGC(1024));
+}
diff --git a/gctest/genie.lua b/gctest/genie.lua
index 0165e7a..e772390 100644
--- a/gctest/genie.lua
+++ b/gctest/genie.lua
@@ -42,3 +42,9 @@ solution 'gctest'
files 'gc_leak.cpp'
links 'test_bench'
+ project 'dummy_gc'
+ kind 'ConsoleApp'
+ language 'C++'
+ files 'gc_dummy.cpp'
+ links 'test_bench'
+