aboutsummaryrefslogtreecommitdiffstats
path: root/src/gc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gc.cpp')
-rw-r--r--src/gc.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/gc.cpp b/src/gc.cpp
index cff4f0a..7dd0d15 100644
--- a/src/gc.cpp
+++ b/src/gc.cpp
@@ -20,8 +20,13 @@
*/
#include <cassert>
-#include <set>
#include <iostream>
+#include <set>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
#include "resp.hpp"
#include "tlsf.h"
@@ -92,3 +97,26 @@ GC::collect(const Roots& roots)
//std::cerr << "[GC] Collect " << oldSize << " => " << _heap.size() << endl;
}
+
+extern "C" {
+
+void*
+resp_gc_allocate(unsigned size)
+{
+ static const size_t COLLECT_SIZE = 8 * 1024 * 1024; // 8 MiB
+
+ static size_t allocated = 0;
+ allocated += size;
+ if (allocated > COLLECT_SIZE) {
+ Object::pool.collect(Object::pool.roots());
+ allocated = 0;
+ }
+
+ void* mem = Object::pool.alloc(size);
+ Object* obj = new (mem) Object();
+ obj->tag(T_UNKNOWN);
+
+ return mem;
+}
+
+}