diff options
Diffstat (limited to 'stm/gccollect.c')
-rw-r--r-- | stm/gccollect.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/stm/gccollect.c b/stm/gccollect.c index ada5493a23..e4b37f37fc 100644 --- a/stm/gccollect.c +++ b/stm/gccollect.c @@ -8,20 +8,36 @@ #include "gccollect.h" #include "systick.h" -void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end); +machine_uint_t gc_helper_get_regs_and_sp(machine_uint_t *regs); + +// obsolete +// void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end); void gc_collect(void) { + // get current time, in case we want to time the GC uint32_t start = sys_tick_counter; + + // start the GC gc_collect_start(); - gc_collect_root((void**)&_ram_start, ((uint32_t)&_heap_start - (uint32_t)&_ram_start) / sizeof(uint32_t)); + + // scan everything in RAM before the heap + // this includes the data and bss segments + // TODO possibly don't need to scan data, since all pointers should start out NULL and be in bss + gc_collect_root((void**)&_ram_start, ((uint32_t)&_bss_end - (uint32_t)&_ram_start) / sizeof(uint32_t)); + + // get the registers and the sp machine_uint_t regs[10]; - gc_helper_get_regs_and_clean_stack(regs, (machine_uint_t)&_heap_end); - gc_collect_root((void**)&_heap_end, ((uint32_t)&_ram_end - (uint32_t)&_heap_end) / sizeof(uint32_t)); // will trace regs since they now live in this function on the stack + machine_uint_t sp = gc_helper_get_regs_and_sp(regs); + + // trace the stack, including the registers (since they live on the stack in this function) + gc_collect_root((void**)sp, ((uint32_t)&_ram_end - sp) / sizeof(uint32_t)); + + // end the GC gc_collect_end(); - uint32_t ticks = sys_tick_counter - start; // TODO implement a function that does this properly if (0) { // print GC info + uint32_t ticks = sys_tick_counter - start; // TODO implement a function that does this properly gc_info_t info; gc_info(&info); printf("GC@%lu %lums\n", start, ticks); |