summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authormux <freelancer.c@gmail.com>2014-01-24 21:27:55 +0200
committermux <freelancer.c@gmail.com>2014-01-24 21:33:19 +0200
commita215b09c0dc29b82161092e92ea2e5e004d79468 (patch)
tree00998af77e7523d1d0ecd3446690b9a02ae36c9d /py
parent40048adabc2399f778ff7acd9ecd16fce239ec1a (diff)
Move gc_collect to py/gc.c
* Move gc_collect from main to py/gc.c * Define GC's memory boundaries in linker script * Issue #220
Diffstat (limited to 'py')
-rw-r--r--py/gc.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/py/gc.c b/py/gc.c
index 70b071ebc..73e243665 100644
--- a/py/gc.c
+++ b/py/gc.c
@@ -187,6 +187,22 @@ void gc_collect_end(void) {
gc_sweep();
}
+extern void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end);
+
+void gc_collect(void) {
+ extern char _ram_start; /* defined by linker script */
+ extern char _ram_end; /* defined by linker script */
+ extern char _heap_start; /* defined by linker script */
+ extern char _heap_end; /* defined by linker script */
+
+ gc_collect_start();
+ gc_collect_root((void**)&_ram_start, (&_heap_start - &_ram_start) / 4);
+ machine_uint_t regs[10];
+ gc_helper_get_regs_and_clean_stack(regs, (uint32_t) &_heap_end);
+ gc_collect_root((void**)&_heap_end, (&_ram_end - &_heap_end) / 4); // will trace regs since they now live in this function on the stack
+ gc_collect_end();
+}
+
void gc_info(gc_info_t *info) {
info->total = (gc_pool_end - gc_pool_start) * sizeof(machine_uint_t);
info->used = 0;