diff options
| Commit | 22b321bb4497543493010f57587c7a9dceb839b6 (patch) | |
|---|---|---|
| Author | 2021-09-21 22:48:52 +0300 | |
| Committer | 2021-09-21 22:48:52 +0300 | |
| Files | 672d53f7d257df54d2222252bd2441f12b3be950 /gctest/src/gc_dummy.cpp | |
| IPL-22b321bb4497543493010f57587c7a9dceb839b6.tar IPL-22b321bb4497543493010f57587c7a9dceb839b6.tar.gz IPL-22b321bb4497543493010f57587c7a9dceb839b6.zip | ||
| Parent | f110794b0d57e47e335ae5eeffbb18a7a80580ad (diff) | |
| Parent | 2f9dea35cff40a676b4603b8ffbd1f2669a4195a (diff) | |
Merge pull request #115 from SofiaCPP/feature/gctest
Add app to test GC implementations
1 files changed, 71 insertions, 0 deletions
| -rw-r--r-- | gctest/src/gc_dummy.cpp | 71 |
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 <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, char*[])
+{
+ return std::unique_ptr<GarbageCollector>(new DummyGC(1024));
+}
|
