summaryrefslogtreecommitdiffstatshomepage
path: root/stm/gccollect.c
diff options
context:
space:
mode:
Diffstat (limited to 'stm/gccollect.c')
-rw-r--r--stm/gccollect.c26
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);