diff options
author | mux <freelancer.c@gmail.com> | 2014-01-24 21:27:55 +0200 |
---|---|---|
committer | mux <freelancer.c@gmail.com> | 2014-01-24 21:33:19 +0200 |
commit | a215b09c0dc29b82161092e92ea2e5e004d79468 (patch) | |
tree | 00998af77e7523d1d0ecd3446690b9a02ae36c9d /py | |
parent | 40048adabc2399f778ff7acd9ecd16fce239ec1a (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.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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; |